Set作为集合,有两个特点:唯一且无序。
Zset是有序集合,在保证唯一的情况下,是根据什么来排序的呢?排序的规则是什么?
Zset中的member引入了一个属性,分数(score),浮点类型,每个member都会安排一个分数,进行排序的时候,就是按照此处的分数大小来进行升序、降序的操作。
目录
普通命令
ZADD
ZADD key [NX | XX] [GT | LT] [CH] [INCH] score member [score member ...]
添加元素的时候,既要添加元素又要添加分数。
不加 XX | NX 的时候,如果当前member不存在,此时就会达到“添加新member”的效果,如果当前member已经存在,此时就会更新分数。
如果元素有相同的分数可以按照元素自身字符串的字典数来排列。
Zset内部是按照升序来排列的。
命令 | 描述 |
---|---|
XX | 仅仅用于更新已经存在的元素,不会添加新元素。 |
NX | 仅用于添加新元素,不会更新已经存在的元素。 |
CH | 默认情况下,ZADD返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。 |
INCR | 此时命令类似ZINCRBY的效果,将元素的分数加上指定的分数。此时只能指定一个元素和1分数。 |
ZRANGE
查询操作,后面加上withscores,可以查询到ZADD添加的分数。
ZCARD
获取一个Zset的基数,即Zset中的元素个数。
ZCOUNT
返回分数在某个区间的元素个数。
ZCOUNT key min max
可以遍历一遍后,就可以知道min和max,但是如果进行遍历,时间复杂度就不是O(logN)了。
实际上,Zset内部会记录每个元素当前的排行(次序),查询到元素就能知道元素所在的次序。
ZREVRANGE
ZRANGE是按照升序来排序,ZREVRANGE则是按照降序来排序。
ZRANGEBYSCORE
按照分数来找元素,通过min max来划分区间。
ZPOPMAX key [count]
ZPOPMAX ZPOPMIN
删除并返回分数最高(低)的count个元素。
如果存在多个元素分数相同,并且同时为最大(小)值,此时删除的时候仍然只删除一个。
如果分数相同会按照membe字符串的字典序决定先后。
BZPOPMAX BZPOPMAX
BZPOPMAX key [key ...] timeout
这个命令就是ZPOPMAX的阻塞版本,timeout表示超时时间,表示最多阻塞多久。
ZRANK ZREVRANK
查询元素的下标(排名)。
ZRANK得到的下标,是从前往后算的(升序)。ZREVRANK则相反,按照降序。
ZSCORE
查询指定元素的分数。时间复杂度为O(1)。
ZSCORE key member
ZREM
删除指定元素。
ZREM key member [member ...]
ZREMRANGEBYRANK
ZREMRANGEBYRANK key start stop
对于start和stop区间下标的进行元素删除。
ZREMRANGEBYRANK
ZREMRANGEBYSCORE key min max
对于min和max之间的分数,进行元素删除。
ZINCRBY
ZINCRBY key increment member
ZINCRBY命令会将有序集合中指定成员的分数增加指定的值。
如果成员不存在,它会先创建该成员,然后增加分数。
如果指定的分数增加后为负数,则分数会被设置为 0 。
集合间操作
交集 ZINTERSTORE
ZINTERSTORE
是 Redis 用于合并两个或多个有序集合的命令,并存储结果到一个新的有序集合中。
ZINTERSTORE destination numkeys key [key ...]
[WEIGHTS weight [weight ...]]
[AGGREGATE SUM|MIN|MAX]
参数
destination
:存储结果的有序集合的名称。numkeys
:参与合并的有序集合的数量。key [key ...]
:要合并的有序集合的名称列表。WEIGHTS weight [weight ...]
:(可选)每个有序集合的权重列表,用于调整每个集合成员在计算结果时的权重。AGGREGATE
:(可选)指定如何合并分数,可以是SUM
(默认)、MIN
或MAX
。
可以看到,添加了权重的值,会取权重乘以原集合的值,再取sum添加到新的集合中去。
并集 ZUNIONSTOR
ZUNIONSTOR用法和ZINTERSTORE基本一致。
Zset应用场景
1.微博热搜
2.游戏天梯排行
3.成绩排行
对于zset,很多排行榜的场景,可以用到交集和并集,把一些成绩合并起来,并且通过动态排序来完成。