一、Redis 入门概述
Redis:REmote Dictionary Server(远程字典服务器)
Redis是完全开源的,使用ANSIC语言编写遵守BSD协议,是一个高性能的Key-Value数据库提供的丰富的数据结构,例如String、Hash、List、Set、SortedSet等等。数据是存在内存中的,同时Redis支持事务、持久化、LUA脚本、发布/订阅、缓存淘汰、流技术等多种功能特性提供了主从模式、Redis Sentinel和Redis Cluster集群架构方案。
1.1 主流功能与应用
-
分布式缓存,挡在mysql数据库之前的带刀护卫。与传统数据库关系(mysql)相比,Redis是key-value数据库(NoSQL一种),mysql是关系型数据库,Redis数据操作主要在内存,而mysql主要存储在磁盘;Redis在某一些场景使用中要明显优于mysql,eg:计数器,排行榜等方面,Redis通常用于一些特定场景,需要与mysql一起配合使用。两者并不是相互替换和竞争的关系,而是共用和配合使用。
-
内存存储和持久化(RDB+AOF),Redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务
-
高可用架构搭配
- 单机
- 主从
- 哨兵
- 集群
-
缓存穿透、击穿、雪崩
-
分布式锁
-
队列,Reids提供list和set操作,这使得Redis能作为一个很好的消息队列平台来使用。 我们常通过Reids的队列功能做购买限制。比如到节假日或者推广期间,进行一些活动, 对用户购买行为进行限制,限制今天只能购买几次商品或者一段时间内只能购买一次。也比较适合适用。
-
排行榜+点赞,Redis提供的zset数据类型能够快速实现这些复杂的排行榜。
1.2 Redis优势
-
性能极高-Redis能读的速度是110000次/秒,写的速度是81000次/秒
-
Redis数据类型丰富,不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
-
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
-
Redis支持数据的备份,即master-slave模式的数据备份
Redis10大数据类型
redis的key的类型都是字符串,value有以下十大数据类型
帮助命令,help @类型:
help @string
help @list
help @hash
help @hyperloglog
命令不区分大小写,而key是区分大小写的:
eg:
keys *:查看当前库所有的key
exists key:判断某个key是否存在
type key:查看你的key是什么类型
del key:删除指定的key数据
unlink key:非阻塞删除,仅仅将keys从keyspace元数据中删除,真正删除会在后续异步中操作
ttl key:查看还有多少秒过期,-1表示永不过期,-2表示已过期
expire key:为给定的key设置过期时间
move key dbindex[0 - 15]:将当前数据库的key移动到给定的数据库db当中
select dbindex:切换数据库[0 - 15],默认为0
dbsize:查看当前数据库key的数量
flushdb:清空当前库
flushall:通杀全部库
3.1 String(字符串)类型
string 是 redis 最基本的类型,一个key对应一个value。
string类型是二进制安全的,意思是redis的string可以包含任何数据,eg:jpg图片或者序列化的对象。
string类型是redis最基本的数据类型,一个redis中字符串value最多可以是512M。
常用命令:
| 序号 | 命令 | 作用 |
|---|---|---|
| 1 | set key value | 设置指定key的值 |
| 2 | get key | 获取指定key的值 |
| 3 | getrange key start end | 返回key中字符串值的子字符 |
| 4 | getset key value | 将给定key的值设为value |
| 5 | getbit key offset | 对key所储存的字符串值,获取指定偏移量上的位(bit) |
| 6 | mget key1 [key2] | 获取所有(一个或多个)给定key的值 |
| 7 | setbit key offset value | 对key所储存的字符串值,设置或清楚指定偏移量上的位(bit) |
| 8 | setex key seconds value | 将值value关联到key,并将key的过期时间设为seconds(以秒为单位) |
| 9 | setnx key value | 只有在key不存在时设置key的值 |
| 10 | setrange key offset value | 用value参数覆写给定key所储存的字符串值,从偏移量offset开始 |
| 11 | strlen key | 返回key所储存的字符串值的长度 |
| 12 | mset key value [key value……] | 同时设置一个或多个key-value对 |
| 13 | msetnx key value [key value……] | 同时设置一个或多个key-value对,当且仅当所有给定key都不存在 |
| 14 | psetex key milliseconds value | 将值value关联到key,并将key的过期时间设为milliseconds(以毫秒为单位) |
| 15 | incr key | 将key中储存的数字值增一 |
| 16 | incrby key increment | 将key所储存的值加上给定的增量值(increment) |
| 17 | incrbyfloat key increment | 将key所储存的值加上给定的浮点增量值(increment) |
| 18 | decr key | 将key中储存的数字值减一 |
| 19 | decrby key decrement | 将key所储存的值减去给定的减量值(decrement) |
| 20 | append key value | 如果key已经存在并且是一个字符串,append命令将value追加到key原来的值的末尾 |
应用场景:
+ 抖音无限点赞某个视频或作品,点一下加一次
+ 是否喜欢的文章
3.2 List(列表)类型
redis列表是简单的字符串列表,按照插入顺序排序。可以从列表的头部(左边)或者尾部(右边)进行添加。
它的底层实际是个 双端链表 ,最多可以包含2^32 - 1个元素(4294967295,每个列表超过40亿个元素)。主要功能有push/push等,一般用在栈、队列、消息队列等场景。
left、right都可以插入添加:
如果键不存在,创建新的链表;
如果键已存在,新增内容;
如果值全移除,对应的键也就消失了。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
常用命令:
| 序号 | 命令 | 作用 | |
|---|---|---|---|
| 1 | blpop key1 [key2] timeout | 移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 | |
| 2 | brpop key1 [key2] timeout | 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 | |
| 3 | brpoplpush source destination timeout | 从列表中弹出一个值,将弹出的元素插入到另一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 | |
| 4 | lindex key index | 通过索引获取列表中的元素 | |
| 5 | linsert key before | after pivot value | 在列表的元素前或后插入元素 |
| 6 | llen key | 获取列表长度 | |
| 7 | lpop key | 移除并获取列表的第一个元素 | |
| 8 | lpush key value1 [value2] | 将一个或多个值插入到列表头部 | |
| 9 | lrange key start stop | 获取列表指定范围内的元素 | |
| 10 | lrem key count value | 移除列表元素 | |
| 11 | lpushx key value | 将一个或多个值插入到已存在的列表头部 | |
| 12 | lset key index value | 通过索引设置列表元素的值 | |
| 13 | ltrim key start stop | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素将被删除 | |
| 14 | rpop key | 移除并获取列表最后一个元素 | |
| 15 | rpoplpush source destination | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 | |
| 16 | rpush key value1 [value2] | 在列表中添加一个或多个值 | |
| 17 | rpushx key value | 为已存在的列表添加值 |
应用场景:微信公众号订阅的消息
3.3 Hash(哈希表)类型
hash 是一个 string类型的 field(字段)和 value(值)的映射表,hash特别适合用于存储对象。redis中的每个hash可以存储2^32 - 1 键值对(40多亿)。
KV模式不变,但V是一个键值对。Map<String, Map<Object, Object>>
| 序号 | 命令 | 作用 |
|---|---|---|
| 1 | hdel key field1[field2] | 删除一个或多个哈希表字段 |
| 2 | hexists key field | 查看哈希表key中,指定的字段是否存在 |
| 3 | hget key field | 获取存储在哈希表中指定字段的值 |
| 4 | hgetall key | 获取在哈希表中指定key的所有字段和值 |
| 5 | hincrby key field increment | 为哈希表key中的指定字段的整数值加上增量increment |
| 6 | hincrbyfloat key field increment | 为哈希表key中的指定字段的浮点数值加上增量increment |
| 7 | hkeys key | 获取所有哈希表中的字段 |
| 8 | hlen key | 获取所有哈希表中的字段 |
| 9 | hmget key field1 [field2] | 获取所有给定字段的值 |
| 10 | hmset key field1 value1 [field2 value2] | 同时将多个field-value(域-值)对设置到哈希表key中 |
| 11 | hset key field value | 将哈希表key中的字段field的值设为value |
| 12 | hsetnx key field value | 只有在字段field不存在时,设置哈希表字段的值 |
| 13 | hvals key | 获取哈希表中所有值 |
| 14 | hscan key cursor [MATCH pattern] [COUNT count] | 迭代哈希表中的键值对 |
应用场景:JD购物车早期设计 目前不再采用,当前小中厂可用
3.4 Set(集合)
无序无重复
有序有重复
redis 的 set 是 String 类型的 无序集合 。集合成员是唯一的,且集合中无重复的数据,集合的对象编码可以是intset或者hashtable。
redis中的set集合是通过哈希表实现的,故添加、删除、查找的复杂度都是O(1)。
集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)
3.5 ZSet(有序集合)
zset(sorted set:有序集合)
redis中的zset和set一样也是String类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数 ,redis正是通过分数(score)来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zset的集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为2^32 - 1
3.6 GEO(地理空间)
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,包括
- 添加地理位置的坐标。
- 获取地理位置的坐标。
- 计算两个位置之间的距离。
- 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
3.7 HyperLogLog (基数统计)
HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
3.8 bitmap(位图)
由0和1状态表现的二进制位的bit数组
3.9 bitfield(位域)
通过bitfield命令可以一次性操作多个比特位域(指的是连续的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。
3.10 Stream(流)
Redis Stream 是 Redis 5.0 版本新增加的数据结构。
Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。
简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。
而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失
3.11 Redis常用命令
| 序号 | 操作 | 作用 |
|---|---|---|
| 1 | del key | 用于key存在时删除key |
| 2 | dump key | 序列化给定的key,并返回被序列化的值 |
| 3 | exists key | 检查给定的key是否存在 |
| 4 | expire key | 为给定的key设置过期时间 |
| 5 | expireat key timestamp | expireat的作用和expire类似,都用于key设置过期时间。不同在于expireat命令模式接受的时间参数时UNIX时间戳(unix timestamp) |
| 6 | pexpire key milliseconds | 设置key的过期时间以毫秒计 |
| 7 | pexpireat key milliseconds-timesstamp | 设置key过期时间的时间戳(unix timestamp)以毫秒计 |
| 8 | keys pattern | 查找所有符合给定模式(pattern)的key |
| 9 | move key db | 将当前数据库的key移动到给定的数据库db当中 |
| 10 | persist key | 移除key的过期时间,key将持久保持 |
| 11 | pttl key | 以毫秒为单位返回key的剩余过期时间 |
| 12 | ttl key | 以秒为单位,返回给定key的剩余生存时间(TTL,time to time) |
| 13 | randomkey | 从当前数据库中随机返回一个key |
| 14 | rename key newkey | 修改key的名称 |
| 15 | renamenx key newkey | 仅当newkey不存在时,将key改为newkey |
| 16 | type key | 返回key所储存的值的类型 |
未完后续补😭