Zset
有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,使得有序集合中的元素一直是有序的
Zset的排序规则
给Zset的member引入了一个属性分数(score)每个member都会安排一个分数,进行排序的时候,都是按照此处的分数大小进行升序或者降序进行排序的
分数相同,按照元素自身的字符串的字典序来排序
分数不同,按照分数来进行排序
Zset中默认是按照升序进行排序的
List,Set,Zset的异同点
数据结构 | 是否有重复的元素 | 是否有序 | 有序的依据 | 应用的场景 |
List列表 | 是 | 是 | 索引的下标 | 时间轴,消息队列 |
Set集合 | 否 | 否 | 标签,社交 | |
Zset有序集合 | 否 | 是 | 分数 | 排行榜系 |
普通命令
zadd
添加或者更新指定的元素以及关联的分数到Zset中
NX:仅用于添加元素,不能更新已经存在的元素
XX:仅仅用于更新已经存在的元素,不会添加新元素
如果是添加新的元素,则不会添加成功
CH:返回新增元素和更新元素的数量(如果不加CH,只会返回的是新增元素的数量)
INCR:将元素加上指定的分数(类似于zincrby)
之前的Hash,Set,List添加一个元素很多的时候都是O(1),但是Zset添加元素是log(N),因为Zset在添加元素的时候需要找到其顺序,将其放到合适的位置上
zcard
获得元素的个数,返回值为元素的个数
zcount
获得分数在某一区间的元素个数(闭区间)
如果要排除边界值,需要加上(
zrange
查看有序集合的元素详情,可以指定区间
如果要查看其分数的详情,加上withscores
时间复杂度是O(log(N)+M),M则是查询区间的长度
zrevrange
逆序查看有序集合的元素详情
zrangebyscores
根据分数来进行查询
zpopmax
删除并返回分数最高的count个元素
如果存在多个元素,且存在分数值相同的元素同时为最大值,也会进行删除,顺序由member字符串的字典序决定先后
zpopmin
删除并返回分数最低的count个元素
bzpopmax
zpopmax的阻塞版本
如果该元素不存在,则会进入阻塞,等待删除
在另一边的客户端进行添加该元素,则会删除成功
bzpopmin
zpopmin的阻塞版本
在另一边的客户端进行添加该元素,则会删除成功
zrank
查看指定元素的排名,升序
zrevrank
返回指定元素的排名,降序
zscore
返回指定元素的分数
zrem
删除指定的元素
也可以同时指定多个元素进行删除
时间复杂度为O(log(N)M)
M为删除的个数
N为有序集合中的元素的个数
zremrangebyrank
按照下标删除指定范围内的元素(左闭右闭)
这个范围指的是下标的范围
zremrangebyscore
按照分数删除指定范围的元素(左闭右闭)
zincrby
为指定的元素关联的分数添加指定的分数
不光会修改分数,还会移动元素的位置,使有序集合中的元素仍然使有序的
集合间的操作
有序集合间的交集操作---zinterstore
weight是用来设置权重的
默认会对两个求交集的key中都有的member中的分数求和在存入的key中
但是可以修改交集中相同成员的分数采用最小值
有序集合间的并集操作---zunionstore
在求并集的过程中,如果存在了相同的元素,则会默认对两个求并集的key中都有的member中的分数求和
跟交集的用法基本一致
内部编码
紧凑列表包listpack
节省内存空间
如果有序集合中的元素个数较小,单个元素的体积较小,则会使用listpack来存储
从 Redis 5.0 起,listpack
被引入,并逐步取代了 ziplist
。
skiplist跳表
如果有序集合中元素个数较多,或者单个的体积很大,则会使用skiplist来存储
使用场景
有序集合进行排行榜系统的设定:记录用户积分、游戏得分、考试成绩等,并支持实时排行
微博热榜的信息:根据搜索次数、阅读量、点击量等打分,实时更新“热度”榜单
电商平台根据优惠券的价值或者优先级来进行展示,权重越高排在越前面。
希望对大家有所帮助!!!!!