一、列表、集合、有序集合三者异同点
数据结构 | 是否允许重复元素 | 是否有序 | 有序实现方式 | 应用场景 |
列表 | 是 | 是 | 索引下标 | 时间轴/消息队列 |
集合 | 否 | 否 | 无 | 标签社交 |
有序集合 | 否 | 是 | 分值 | 排行榜系统、社交等 |
二、命令
1.集合内
(1)添加成员
zadd key score member [score member ...]
返回结果代表成功添加的成员个数
nx | member必须不存在,才可以设置成功,用于添加 |
xx | member必须存在,才可以设置成功,用于添加 |
ch | 返回此次操作后,有序集合元素和分数发生变化的个数 |
incr | 对score做增加,相当于后面介绍的zincrby |
- 有序集合相比集合提供了排序字段,但是也产生了代价,zadd的时间复杂度为O(log(n)),sadd的时间复杂度为O(1)
(2)计算成员个数
zcard key
时间复杂度O(1)
(3)计算某个成员的分数
zscore key member
如果成员不存在,则返回nil
(4)计算成员的排名
zrank key member
zrevrank key member
zrank 是从分数从低到高返回排名,zrevrank反之
(5)删除成员
zrem key member [member ...]
返回结果为成功删除的个数
(6)增加成员分数
zincrby key increment member
(7)返回指定排名范围的成员
zrange key start end [withscores]
zrevrange key start end [withscores]
(8)返回指定分数范围的成员
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]
同时min和max还支持开区间(小括号)和闭区间(中括号),-inf +inf分别代表无限小和无限大
(9)返回指定分数范围成员个数
zcount key min max
(10)删除指定排名内的升序元素
zremrangebyrank key start end
(11)删除指定分数范围的成员
zremrangebyscore key min max
2.集合间操作
(1)交集
zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum | min | max]
- destination 交集计算结果保存到这个键
- numkeys 需要做交集计算键的个数
- key [key …] 需要做交集计算的键
- weights weight [weight …] 每个键的权重,在做交集计算时,每个键中的每个member会将自己分数乘以这个权重,每个键的权重默认是1
- aggregate sum | min | max:计算成员交集后,分值可以按照sum(和)、min(最小值)、max(最大值)做汇总,默认值是sum
(2)并集
zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum | min | max]
三、内部编码
ziplist(压缩列表):
- 当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以减少内存的使用
skiplist(跳跃表):
- 当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写效率会下降
四、使用场景
排行榜系统