简介
Redis是一个使用ANSI C编写的开源、支持网络、基于内存、分布式、可选持久性的键值对存储数据库,是现在最受欢迎的NoSQL数据库之一,支持多种数据结构,其中包括String(字符串)、List(列表)、Hash(字典)、Set(集合) 、 Sorted Set(有序集合) 五个常见数据结构,从 2.2.0 版本开始新增三个高级数据结构HyperLogLog、Geo、Bitmap。
String(字符串)
介绍
Redis字符串存储字节序列,包括文本、序列化对象和二进制数组,存储值大小不能超过512mb。 Redis 并没有使用 C 的字符串表示,其内部构建了一种简单动态字符串(Simple Dynamic String,SDS)。
常用命令
Redis官网String命令: https://redis.io/commands/?group=string
命令 | 说明 |
---|---|
SET key value | 设置 key 的值 |
SETNX key value | 只有在 key 不存在时设置 key 的值 |
GET key | 获取 key 的值 |
MSET key1 value1 key2 value2 ... | 设置一个或多个 key 的值 |
MGET key1 key2 ... | 获取一个或多个 key 的值 |
STRLEN key | 返回 key 所储存的字符串值的长度 |
INCR key | 将 key 中储存的数字值增一 |
DECR key | 将 key 中储存的数字值减一 |
EXISTS key | 判断 key 是否存在 |
DEL key(通用) | 删除某个 key |
EXPIRE key seconds(通用) | 给某个 key 设置过期时间 |
应用场景
1.缓存对象
假设缓存某个用户信息,有如下两种方式:
- 直接缓存JSON对象,命令例子:
SET user:1 '{"name":"jm", "age":29}'
。 - 采用将 key 进行分离为 user:ID:属性缓存,命令例子:
MSET user:1:name jm user:1:age 29
。
2.常规计数
因为 Redis 处理命令是单线程,所以执行命令的过程是原子的。因此 String 数据类型适合计数场景,比如计算访问次数、点赞、转发、库存数量等等,相关命令INCR
、GET
。
3.分布式锁
SET 命令有个 NX 参数可以实现「key不存在才插入」,可以用它来实现分布式锁。
List(列表)
介绍
Redis中的 List 其实就是链表数据结构的实现,可以从头部或尾部向 List 列表添加元素,列表的最大长度为 2^32 - 1。List 类型的底层数据结构是由双向链表或压缩列表实现的,在 Redis 3.2 版本之后,List 数据类型底层数据结构就只由 quicklist 实现了,替代了双向链表和压缩列表。
常用命令
Redis官网List命令: https://redis.io/commands/?group=list
命令 | 说明 |
---|---|
LPUSH key value1 value2 ... | 在指定列表的头部(左边)添加一个或多个元素 |
RPUSH key value1 value2 ... | 在指定列表的尾部(右边)添加一个或多个元素 |
LSET key index value | 将指定列表索引 index 位置的值设置为 value |
LPOP key | 移除并获取指定列表的第一个元素(最左边) |
RPOP key | 移除并获取指定列表的最后一个元素(最右边) |
LLEN key | 获取列表元素数量 |
LRANGE key start end | 获取列表 start 和 end 之间的元素 |
应用场景
1.信息流展示
如最新文章和动态获取,相关命令LPUSH
、LRANGE
2.消息队列
List 可以用来做消息队列,但是不建议这样做,其中存在很多缺陷。
相对来说,Redis 5.0 新增加的一个数据结构 Stream 更适合做消息队列一些,只是功能依然非常简陋。和专业的消息队列相比,还是有很多欠缺的地方比如消息丢失和堆积问题不好解决。
Hash(哈希)
介绍
Redis中的 Hash 是一个 String 类型的 field-value(键值对)的映射表,value 的形式如: value=[{field1,value1},...{fieldN,valueN}]。Hash类型的底层数据结构是由压缩列表或哈希表
实现,在Redis 7.0
中,压缩列表数据结构已经废弃了,交由listpack
数据结构来实现了。
常用命令
Redis官网Hash命令: https://redis.io/commands/?group=hash
命令 | 说明 |
---|---|
HSET key field value | 设置某个哈希表中指定字段的值 |
HSETNX key field value | 只有指定字段不存在时才设置字段的值 |
HMSET key field1 value1 field2 value2 ... | 同时将一个或多个 field-value (域-值)对设置到指定哈希表中 |
HGET key field | 获取某个哈希表中指定字段的值 |
HMGET key field1 field2 ... | 获取某个哈希表中一个或多个指定字段的值 |
HGETALL key | 获取某个哈希表中所有的键值对 |
HEXISTS key field | 查看某个哈希表中指定的字段是否存在 |
HDEL key field1 field2 ... | 删除一个或多个哈希表字段 |
HLEN key | 获取某个哈希表中字段的数量 |
HINCRBY key field increment | 对某个哈希中的指定字段做运算操作(increment值正数表示加,负数表示减) |
应用场景
常用于用户信息、商品信息、购物车等数据存储,相关命令HSET
、HMSET
、HGET
、HMGET
Set(集合)
介绍
Redis中的 Set 类型是一个无序并唯一的键值集合,它的存储顺序不会按照插入的先后顺序进行存储。Set 类型的底层数据结构是由哈希表或整数集合实现。
常用命令
Redis官网Set命令: https://redis.io/commands/?group=set
命令 | 说明 |
---|---|
SADD key member1 member2 ... | 向某个集合添加一个或多个元素 |
SMEMBERS key | 获取某个集合中的所有元素 |
SCARD key | 获取某个集合的元素数量 |
SISMEMBER key member | 判断指定元素是否在某个集合中 |
SINTER key1 key2 ... | 获取给定所有集合的交集 |
SINTERSTORE destination key1 key2 ... | 将给定所有集合的交集存储在destination 中 |
SUNION key1 key2 ... | 获取给定所有集合的并集 |
SUNIONSTORE destination key1 key2 ... | 将给定所有集合的并集存储在destination 中 |
SDIFF key1 key2 ... | 获取给定所有集合的差集 |
SDIFFSTORE destination key1 key2 ... | 将给定所有集合的差集存储在destination 中 |
SPOP key count | 随机移除并获取某个集合中一个或多个元素 |
SRANDMEMBER key count | 随机获取某个集合中指定数量的元素 |
应用场景
网站 UV 统计(数据量巨大的场景还是 HyperLogLog更适合一些)、文章点赞、动态点赞、共同关注(交集)、好友推荐(差集)、订阅号推荐(差集+交集)、抽奖系统等场景。
Sorted Set(有序集合)
介绍
Redis中的 Sorted Set类型(有序集合类型)相比于 Set 类型多了一个排序属性 score(分值),每个存储元素相当于有两个值组成的,一个是有序集合的元素值,一个是排序值。有序集合保留了集合不能有重复元素的特性(分值可以重复),增加了排序能力。Sorted Set类型的底层数据结构是由压缩列表或跳表
实现的,在Redis 7.0
中,压缩列表数据结构已经废弃了,交由 listpack
数据结构来实现了。
常用命令
Redis官网Sorted Set命令: https://redis.io/commands/?group=sorted-set
命令 | 说明 |
---|---|
ZADD key score1 member1 score2 member2 ... | 向某个有序集合添加一个或多个元素 |
ZCARD KEY | 获取某个有序集合的元素数量 |
ZSCORE key member | 获取某个有序集合中指定元素的 score 值 |
ZINTERSTORE destination numkeys key1 key2 ... | 将给定所有有序集合的交集存储在 destination 中,对相同元素对应的 score 值进行 SUM 聚合操作,numkeys 为集合数量 |
ZUNIONSTORE destination numkeys key1 key2 ... | 求并集,其它和 ZINTERSTORE 类似 |
ZDIFFSTORE destination numkeys key1 key2 ... | 求差集,其它和 ZINTERSTORE 类似 |
ZRANGE key start end | 获取某个有序集合 start 和 end 之间的元素(score 从低到高) |
ZREVRANGE key start end | 获取某个有序集合 start 和 end 之间的元素(score 从高到底) |
ZREVRANK key member | 获取某个有序集合中指定元素的排名(score 从大到小排序) |
应用场景
有序集合比较典型的使用场景就是排行榜,例如话题热度排行榜、学生成绩的排名榜、游戏积分排行榜、朋友圈的微信步数排行榜等。
结语
感谢您的阅读,请动动您可爱的小手✌~点赞,留言,关注,转载 4暴击(∩_∩)