zset集合不同于之前的set集合,set集合是无序的,但是zser集合是有序的,这里的有序也不同于List的有序,因为在set中除了有member,每个member还会安排一个score(分数),zset就是根据score来进行排序(降序/升序)。
注意:zset中的member不能重复,但是score可以重复。
Zset类型的命令:
1.zadd key [NX | XX] [GT | LT] [CH] [INCR] score member [score member.....]
添加元素的时候,不仅要添加分数,还要添加member。而且分数在member前
返回值是新增的元素,修改元素的话只会返回0
XX:代表如果存在member就添加,起到一个更新member的作用
NX:代表如果不存在member才添加元素,不会起到更新的效果。
LT:less than 更新已经存在的member,而且新的member的score必须小于当前member的score才能添加成功。如果不存在则直接添加元素
GT:granter than 还是更新已经存在的member,而且新的member的score必须大于当前member的score才能添加成功。如果不存在则直接添加元素
CH : 这个选项可以影响zadd的返回值。返回修改的元素和新增的元素。
INCR:可以针对对应的member增加指定值。
注意:LT/GT命令是redis 6.2之后才引入的
当要查看一个集合,可以使用zrange 查看有序集合中的元素详情**zrange key start stop,**start stop是可以指定下标构成的区间,还可以在后面加上withscores来查看member以及对应的scores。



时间复杂度O(1),因为zset内部数据结构是跳表。
2.ZCARD key
可以用来获取key中元素个数。

3.ZCOUNT key min max
用来查看分数在min和max之间的元素个数。默认是一个闭区间,但如果想要是开区间,就可以加上括号,如下:
zcount key (min (max,这样的设计有点反人类,哈哈,记住就行。时间复杂度O(logN)
-inf 指负无穷大,inf指正无穷大。min和max是可以是小数

zcount的时间复杂度是O(logN)
4.ZREVANGE key start stop
这里可以从降序来查看元素,这里的start和stop是指下标。

5.ZRANGEBYSCORE key min max [withscores]
根据分数来进行获取元素,默认是闭区间,但是可以通过(min (max来排除边界。

6.ZPOPMAX key [count]
这个指令是可以删除前count最大的元素,不写count默认是1。返回值是被删的元素和其分数

时间复杂度O(logN*M),如果存在多个相同分数的member,就按照字典序决定先后进行删除。
7.BZPOPMAX key [key.....] timeout
这里的"有序集合"也可以视为是一个"优先级队列",有点时候,也需要一个阻塞功能的优先级队列。
timeout是超时时间,也就是最多阻塞多久。单位是秒,但是可以写小数形式,写作0.1也就是100ms

这时key中没有元素,所以会被阻塞,阻塞时间600秒

这时右边插入值时,左边立马可以得到结果,返回的是所获得的key的member以及scores。
时间复杂度O(logN),但是如果key中原本就有值,那么就不会阻塞,直接得到值
8.ZPOPMIN key [count]
此方法同理删除count个最小的元素,时间复杂度O(logN*M),不过多介绍了
9.BZPOPMIN key [key.....] timeout
用法和BZPOPMAX一样的。也是充当阻塞队列。时间复杂度O(logN)
10.ZRANK key member
获取对应member元素的下标。

时间复杂度O(logN),这个指令得到的下标是按照升序的排列得到的
11.ZREVRANK key member

这个指令获取对应member元素的下标。但是得到的是按照降序排列的下标
12.ZSCORE key member
这里是查询指定元素的分数,但是这里的时间复杂度是O(1),因为redis做了特定的优化。

13.ZREM key member [member.....]
该指令删除指定的元素。时间复杂度O(logN*M),返回值是成功删除的个数。

14.ZREMRANGEBYRANK key start stop
这个指令可以在start-stop这个范围进行删除,是闭区间。时间复杂度O(logN+M),返回成功删除的个数。

15.ZREMRANGEBYSCORE key min max
这个指令也是指定删除一个指定范围,但是这个范围并不是下标,而是分数范围。返回删除成功个数。
这个范围默认是闭区间,但是可以(min (max添加括号的方法来排除边界。时间复杂度O(logN+M)

16.ZINCRBY key increment member
这个指令是用来做加法的,将对应的元素的分数进行加上一个值,这值可以是正数,负数,小数,但是加了之后还是会维持升序的。

返回的是更新之后的分数。
Zset集合间操作:
ZINTERSTORE/ZUNIONSTORE/ZDIFFSTORE destination numkeys Zset1 Zset2 [weights 2 3] [aggregate <SUM|MIN|MAX]
destination:是要把结果储存到哪个集合中。
numkeys:指后续有几个key(集合)会参与集合运算。
weights:指权重,为Zset1设置权重2,为Zset2设置权重为3,就是将Zset1中的分数乘以2,Zset2中的分数乘以3,。
aggregate:分数聚合方式,默认是sum,就是决定结果集中的元素的分数是SUM(总和),MAX(最大的),MIN(最小的)


如果不指定aggregate,默认是SUM(求和)
Zset编码方式:
1.有序集合 ziplist :有序集合中元素个数少,或者单个元素体积小
2.跳表 skiplist :如果元素个数多,并且单个元素体积大
Zset使用场景:
1.游戏天梯排名:
只需要把玩家的数值直接放入有序集合中即可,可以自动排序。
可以按照升序或者降序进行排序。还能进行范围查询,随着分数的变化,还能自动的维持升序或者降序。
2.微博热搜
微博热搜可能不想游戏天梯排行这么简单,这里里面涉及到权重和集合操作
比如:热度是一个综合数值,需要考虑浏览量,点赞量,转发量,评论量等,所占有的比重也不一样,这样的操作,zset也能做,集合操作和权重。