一、列表、集合、有序集合三者异同点

数据结构 是否允许重复元素 是否有序 有序实现方式 应用场景
列表 索引下标 时间轴/消息队列
集合 标签社交
有序集合 分值 排行榜系统、社交等

二、命令

1.集合内

(1)添加成员
		zadd key score member [score member ...]
		返回结果代表成功添加的成员个数
  • nx xx ch incr
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的读写效率会下降

四、使用场景

排行榜系统