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

相关推荐
小陈工8 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花12 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸12 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain12 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希13 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神13 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员13 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java13 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿14 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴14 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存