有序集合zset
有序集合 不能有重复成员,元素可以排序,和列表的索引下标不同, 排序依据的是分数(score),分数可以重复。提供获取 指定分数和元素范围查询、计算成员排名等功能。
数据结构 | 是否允许重复元素 | 是否有序 | 有序实现方式 | 应用场景 |
列表 | 是 | 是 | 索引下标 | 时间轴、消息队列等 |
集合 | 否 | 否 | 无 | 标签、社交等 |
有序集合 | 否 | 是 | 分数 | 排行榜、社交等 |
命令
1、集合内
[list]
zadd key score member [score member ...]
zadd有nx、xx、ch、incr是个选项:
nx:用于新增,member必须不存在
xx:用于更新,member必须存在
ch:返回zadd操作后,有序集合元素和分数发生变化的个数
incr:对score做增加,相当于zincrby命令
zadd的时间复杂度是O(log(n)),而sadd时间复杂度是O(1)
zcard key
zscore key member
zrank key member zrevrank key member
zrank是从分数低到高返回成员的排名,zrevrank则反之
zrem key member [member ...]
zincrby key increment member
zrange key start end [withscores] zrevrange key start end [withscores]
加上withscores会同时返回成员的分数
zrangebyscore key min max [withscores] [limit offset count] zrevrangebyscore key min max [withscores] [limit offset count]
withscores会同时返回成员的分数
[limit offset count]限制输出的起始位置和个数
min和max支持开区间(小括号)和闭区间(中括号),-inf和+inf分别表示无限小和无限大
zcount key min max
zremrangebyrank key start end
zremrangebyscore key min max
[/list]
2、集合间
[list]
zinterstore destination numkeys key [key...] [weights weight [weight ...]] [aggregate sum|min|max]
destination:交集计算结果保存的键
numkeys:需要做交集计算键的个数
key [key ...]:需要做交集计算的键
weights weight [weight ...]:每个键的权重,默认为1,计算时,键中的每个member会将分数乘以权重,每个weight对应上面的每个key
aggregate sum|min|max:计算成员交集后,分值可以按照sum、min、max做汇总,默认为sum
zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggreagate sum|max|min]
[/list]
内部编码
- ziplist:压缩列表,当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个),且每个元素的值都小于zset-max-ziplist-value配置(默认64字节),Redis会用ziplist作为有序集合的内部实现,可以有效减少内存的使用
- skiplist:跳跃表,当ziplist条件不满足时,使用skiplist作为内部实现,因为此时ziplist的读写效率会下降
使用场景
有序集合主要用于排行榜系统,可以按照不同维护进行排行,如时间、播放数量、获得赞数等。
如对于获得赞数,记录用户每天上传视频的排行榜,包括以下几块功能:
[list]
zadd user:ranking:2017_07_07 william 3 zincreby user:ranking:2017_07_07 william 1
zrem user:ranking:2017_07_07 william
zrevrangebyrank user:ranking:2017_07_07 0 9
zscore user:ranking:2017_07_07 william zrank user:ranking:2017_07_07 william
[/list]