Redis数据结构---有序集合

有序集合保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。

有序集合和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数(score) 作为排序的依据。

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

常用命令

集合内
添加成员
zadd key score member [score member ...] [nx|xx|ch|incr]
·nx: member必须不存在, 才可以设置成功, 用于添加。
·xx: member必须存在, 才可以设置成功, 用于更新。
·ch: 返回此次操作后, 有序集合元素和分数发生变化的个数
·incr: 对score做增加, 相当于后面介绍的zincrby。

计算成员个数
zcard key

计算某个成员的分数
zscore key member

计算成员的排名
zrank key member    从分数从低到高返回排名
zrevrank key member  从分数从高到低返回排名

删除成员
zrem key member [member ...]

增加成员的分数
zincrby key increment member

返回指定排名范围的成员
zrange key start end [withscores]
zrevrange key start end [withscores]
有序集合是按照分值排名的, zrange是从低到高返回, zrevrange反之

返回指定分数范围的成员
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]
其中zrangebyscore按照分数从低到高返回, zrevrangebyscore反之。
·withscores选项会同时返回每个成员的分数。 
·limit offset count选项可以限制输出的起始位置和个数

返回指定分数范围成员个数
zcount key min max

删除指定排名内的升序元素
zremrangebyrank key start end

删除指定分数范围的成员
zremrangebyscore key min max



集合间的操作
交集
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。

并集
zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
参数和zinterstore参数一致

时间复杂度

内部编码

有序集合类型的内部编码有两种
·ziplist(压缩列表) : 当有序集合的元素个数小于zset-max-ziplistentries配置(默认128个) , 同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节) 时, Redis会用ziplist来作为有序集合的内部实现, ziplist可以有效减少内存的使用。
·skiplist(跳跃表) : 当ziplist条件不满足时, 有序集合会使用skiplist作为内部实现, 因为此时ziplist的读写效率会下降。

使用场景

有序集合比较典型的使用场景就是排行榜系统

例如:视频网站需要对用户上传的视频做排行榜, 榜单的维度可能是多个方面的: 按照时间、 按照播放数量、 按照获得的赞数。 本节使用赞数这个维度, 记录每天用户上传视频的排行榜。

原文地址:https://www.cnblogs.com/MacoLee/p/13970431.html