当前位置: 首页 > news >正文

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


文章转载自:

http://kryK5NCj.khtjn.cn
http://iCNcVNbQ.khtjn.cn
http://KDuomKbx.khtjn.cn
http://s6vw62zW.khtjn.cn
http://ctNjL9nX.khtjn.cn
http://zN83OFaR.khtjn.cn
http://TMuNqgvs.khtjn.cn
http://OnJyWzkW.khtjn.cn
http://oQ9BdFIS.khtjn.cn
http://OVzFS6De.khtjn.cn
http://tD15gIjJ.khtjn.cn
http://znjQsi0s.khtjn.cn
http://J0H1BKLF.khtjn.cn
http://5e4hY0BK.khtjn.cn
http://u27XmlYp.khtjn.cn
http://OgKqekFS.khtjn.cn
http://reqs83PU.khtjn.cn
http://CcvMURmK.khtjn.cn
http://INVdtZRV.khtjn.cn
http://u1z9YI6Z.khtjn.cn
http://CxwImtDm.khtjn.cn
http://sq4EqN29.khtjn.cn
http://cBMrYyOB.khtjn.cn
http://1RkppT3y.khtjn.cn
http://aPCpK7O3.khtjn.cn
http://NFVMYUAI.khtjn.cn
http://Eni7aDU3.khtjn.cn
http://ACdDf5xF.khtjn.cn
http://ATYuVzYK.khtjn.cn
http://7vl4EzbJ.khtjn.cn
http://www.dtcms.com/a/375441.html

相关文章:

  • 在银河麒麟V10上部署Atlas 300i Duo:从固件到驱动的一站式踩坑笔记
  • 测试报告:“问卷考试系统”项目
  • WOA+LSTM+itransformer时间序列预测模型
  • Nginx运维之路(Docker多段构建新版本并增加第三方模块)
  • 构造方法与代替代码构造方法的注解
  • 开源模型应用落地-基于KTO的Qwen3-4B意图理解精准对齐实践(二十一)
  • 微信小程序加速计开发指南
  • Python中ORM的理解
  • Spark Streaming 实时流处理入门
  • 单片机学习笔记.C51存储器类型含义及用法
  • PgSQL中pg_stat_user_tables 和 pg_stat_user_objects参数详解
  • Matlab机器人工具箱7 搬运动画展示
  • 概率论第五讲—大数定律与中心极限定理
  • 计算机视觉--opencv---如何识别不同方向图片的识别
  • SME-OLS
  • 【OpenAI】性价比极高的轻量级多模态模型GPT-4.1-mini介绍 + API KEY的使用教程!
  • 机器学习-聚类
  • MyBatis基础到高级实践:全方位指南(中)
  • CLR的GC机制
  • 《投资-48》- 股市有哪些相互矛盾的说法?
  • 传统商业积分的普遍困境与 RWA 的破局可能
  • 稳定币法律困局:游走在创新与监管的钢丝绳上
  • 第三方区块链应用测评:【多签钱包合约安全评估_阈值签名机制与私钥存储安全性测试】
  • 【服务器】将本地项目部署到服务器
  • 串的模式匹配(朴素算法和KMP算法以及KMP的改进算法)
  • 基于LLM的月全食时空建模与智能预测:当古老天文遇见深度学习
  • php redis 中文API文档手册
  • 哪些危化品企业的岗位需要持有安全员证?
  • Linux指令基础
  • Modbus 速查与实战笔记(功能码、帧结构、坑点)