Redis——zset类型详解

概要

zset是有序集合,将zset中的members引入一个属性score,根据这个属性值来进行排序,其中members不可以重复,score可以重复(按照字典序排序),默认按照升序排序

有序集合中提供指定分数和元素范围查找,计算成员排名功能,一般用于排行榜系统

zset中的member和score并不是键值对的关系,而是pair,既可以通过member找到score,也可以通过score找到member

常用命令

zadd

将元素和对应分数插入到有序集合中,时间复杂度O(logN),因为添加的元素要放到指定的位置上来保证有序,默认返回新增成功的元素个数

方括号中的内容是代表可选的选项

选项 作用
XX 只更新已经存在的元素,不新插入元素
NX 只插入新的元素,不更新已经存在的元素
不加NX或XX 当前members不存在,则添加新元素,否则更新元素分数
LT 只更新已经存在的元素,并且新的分数比当前的分数小
GT 只更新已经存在的元素,并且新的分数比当前的分数大
CH 如果不添加CH选项,默认返回添加元素的个数,添加CH选项后,加上修改元素的个数
INCR 效果相同于ZINCRBY,将指定元素的score+=指定的值,返回值是更新后score的值

zrange

查看有序集合中指定下标范围的元素详情,从0开始,支持负数(-1就是最后一个元素)

时间复杂度O(log(N) + M),其中logN是根据下标找到边界值,M是遍历区间的开销

添加withscores,即可查看members对应的score

示例

加入withscores:

修改操作:

NX选项:

添加不存在元素:

NX选项:

更新存在元素(不会生效):

XX选项:

更新存在元素的score:

XX选项:

更新不存在的元素的score(更新失败):

CH选项:

INCR操作:

zcard

获取指定key中元素个数,时间复杂度为O(1)

zcount

返回指定区间(前闭后闭)内的key中元素的个数,时间复杂度O(logN),(zset内部记录了每个元素的所在次序,logN的时间复杂度找到min和max,然后直接相减次序即可得到元素个数)

min和max支持使用浮点数,inf(无穷大),-inf(负无穷)

演示:

如果想要排除边界值可以加上括号

zrevrange

倒序获取指定范围内的元素

演示:

zrangebyscore

根据分数获取指定范围的元素,使用方法和zcount类似

演示:

zpopmax

删除并返回分数最高的count个元素

时间复杂度O(log(N) + M),N是有序集合中元素的个数,M是count的个数

演示:

如果存在score相同的多个元素,并且都是最大值,那么zpopmax仍然只删除其中的一个元素(按照字典序)

bzpopmax

阻塞版本的zpopmax,时间复杂度O(logN),如果传入多个key,只删除其中的一个

timeout是超时时间,表示最多阻塞多久,单位是秒,支持小数

演示:

客户端a中的key有序集合中没有元素,进行bzpopmax命令,阻塞等待

客户端b插入元素:

此时,客户端a就可以拿到元素了

zpopmin

和zpopmax一致,删除有序集合中score最小的元素

bzpopmin

和bzpopmax一致,阻塞删除有序集合中最小的元素

zrank

获取指定元素的排名,时间复杂度O(logN),member不存在返回nil

演示:

zrevrank

按照正序获取member排名

zscore

返回指定member的score,时间复杂度O(1)

zrem

删除有序集合中指定的member

时间复杂度O(log(N) * M),N是整个有序序列中元素的个数,M是要删除member的个数

返回删除成功的元素的个数

演示:

zremrangebyrank

根据指定排名范围删除member,前闭后闭,时间复杂度O(logN + M),N是整个集合的member个数,M是区间内的元素个数

演示:

zremrangebyscore

删除指定分数范围内的members,闭区间,可以使用(排除边界值,时间复杂度O(logN + M)

演示:

相关推荐
万事大吉CC1 小时前
mysql单表查询·3
数据库·mysql
bin91532 小时前
【EXCEL数据处理】000010 案列 EXCEL文本型和常规型转换。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。
大数据·数据库·信息可视化·数据挖掘·数据分析·excel·数据可视化
Miqiuha2 小时前
lock_guard和unique_lock学习总结
java·数据库·学习
一 乐3 小时前
学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
Java探秘者7 小时前
Maven下载、安装与环境配置详解:从零开始搭建高效Java开发环境
java·开发语言·数据库·spring boot·spring cloud·maven·idea
2301_786964367 小时前
3、练习常用的HBase Shell命令+HBase 常用的Java API 及应用实例
java·大数据·数据库·分布式·hbase
千年死缓7 小时前
go+redis基于tcp实现聊天室
redis·tcp/ip·golang
阿维的博客日记8 小时前
图文并茂解释水平分表,垂直分表,水平分库,垂直分库
数据库·分库分表
wrx繁星点点9 小时前
事务的四大特性(ACID)
java·开发语言·数据库
小小娥子9 小时前
Redis的基础认识与在ubuntu上的安装教程
java·数据库·redis·缓存