Redis中的Zset数据类型

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也能做,集合操作和权重。

相关推荐
zhong liu bin4 小时前
MySQL数据库面试题整理
数据结构·数据库·mysql
luckys.one9 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
言之。10 小时前
Django中的软删除
数据库·django·sqlite
阿里嘎多哈基米12 小时前
SQL 层面行转列
数据库·sql·状态模式·mapper·行转列
抠脚学代码12 小时前
Ubuntu Qt x64平台搭建 arm64 编译套件
数据库·qt·ubuntu
利刃大大12 小时前
【高并发内存池】五、页缓存的设计
c++·缓存·项目·内存池
jakeswang12 小时前
全解MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析
数据库·mysql
Heliotrope_Sun12 小时前
Redis
数据库·redis·缓存
一成码农13 小时前
MySQL问题7
数据库·mysql