2.6 有序集合
有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数(score)作为排序的依据.有序集合提供了获取指定分数和元素范围查询、计算成员排名等功能,合理的利用有序集合,能帮助我们在实际开发中解决很多问题。
有序集合中的元素不能重复,但是score可以重复,就和一个班里的同学学号不能重复,但是考试成绩可以相同。
2.6.1 命令
本节依旧按照集合内和集合外两个维度对有序集合的命令进行介绍。
- 集合内
- 添加成员
zadd key score member [score member ...]
有序集合相比集合提供了排序字段,但是也产生了代价,zadd的时间复杂度为O(log(n)),sadd的时间复杂度为O(1)。
- 计算成员个数
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反之.
- 返回指定分数范围成员个数
zcount key min max
- 删除指定排名内的升序元素
zremrangebyrank key start end
- 删除指定分数范围的成员
zremrangebyscore key min max
- 集合间的操作
- 交集
zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
- 并集
zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
2.6.2 内部编码
有序集合类型的内部编码有两种:ziplist(压缩列表)和skiplist(跳跃表)
2.6.3 使用场景
有序集合比较典型的使用场景就是排行榜系统。例如视频网站需要对用户上传的视频做排行榜,榜单的维度可能是多个方面的:按照时间、按照播放数量、按照获得的赞数。本节使用赞数这个维度,记录每天用户上传视频的排行榜。
网友评论