有序集合保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。
有序集合和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数(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的读写效率会下降。
使用场景
有序集合比较典型的使用场景就是排行榜系统
例如:视频网站需要对用户上传的视频做排行榜, 榜单的维度可能是多个方面的: 按照时间、 按照播放数量、 按照获得的赞数。 本节使用赞数这个维度, 记录每天用户上传视频的排行榜。