论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
数据库
›
SQL-Server
›
详解Redis的Zset类型及相干下令
详解Redis的Zset类型及相干下令
小秦哥
金牌会员
|
2025-1-23 08:00:54
|
显示全部楼层
|
阅读模式
楼主
主题
950
|
帖子
950
|
积分
2850
目次
Zset简介
ZADD
ZCARD
ZCOUNT
ZRANGE
ZREVRANGE
ZRANGEBYSCORE
ZPOPMAX
BZPOPMAX
ZPOPMIN
BZPOPMIN
ZRANK
ZREVRANK
ZSCORE
ZREM
ZREMRANGEBYRANK
ZREMRANGEBYSCORE
ZINCRBY
ZINTERSTORE
内部编码
应用场景
Zset简介
有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它生存了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,着使得有序集合中的元素是可以维护有序性的,但这个有序不是⽤下标作为排序依据⽽是⽤这个分数。
ZADD
添加大概更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf/-inf 作为正负极限也是合法的。
语法
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
复制代码
ZADD 的相干选项:
• XX:仅仅⽤于更新已经存在的元素,不会添加新元素。
• NX:仅⽤于添加新元素,不会更新已经存在的元素。
• CH:默认环境下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包罗本次更新的元素的个数。
• INCR:此时下令雷同 ZINCRBY 的结果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。
时间复杂度:O(log(N)) 返回值:本次添加乐成的元素个数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 1 "uno"
(integer) 1
redis> ZADD myzset 2 "two" 3 "three"
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "uno"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"
复制代码
ZCARD
获取⼀个 zset 的基数(cardinality),即 zset 中的元素个数。 语法
ZCARD key 时间复杂度:O(1) 返回值:zset 内的元素个数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZCARD myzset
(integer) 2
复制代码
ZCOUNT
返回分数在 min 和 max 之间的元素个数,默认环境下,min 和 max 都是包罗的,可以通过 ( 排除。 语法
ZCOUNT key min max 时间复杂度:O(log(N)) 返回值:满⾜条件的元素列表个数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZCOUNT myzset -inf +inf
(integer) 3
redis> ZCOUNT myzset (1 3
(integer) 2
复制代码
ZRANGE
返回指定区间⾥的元素,分数按照升序。带上 WITHSCORES 可以把分数也返回。 语法
ZRANGE key start stop [WITHSCORES]
时间复杂度:O(log(N)+M) 返回值:区间内的元素列表。 举例
redis> ZADD myzset 1 "one" 2 "two" 3 "three"
(integer) 3
redis> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
redis> ZRANGE myzset 2 3
1) "three"
redis> ZRANGE myzset -2 -1
1) "two"
2) "three"
复制代码
ZREVRANGE
返回指定区间⾥的元素,分数按照降序。带上 WITHSCORES 可以把分数也返回。 语法
ZREVRANGE key start stop [WITHSCORES]
时间复杂度:O(log(N)+M) 返回值:区间内的元素列表。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREVRANGE myzset 0 -1
1) "three"
2) "two"
3) "one"
redis> ZREVRANGE myzset 2 3
1) "one"
redis> ZREVRANGE myzset -2 -1
1) "two"
2) "one"
复制代码
ZRANGEBYSCORE
返回分数在 min 和 max 之间的元素,默认环境下,min 和 max 都是包罗的,可以通过 ( 排除。 语法
ZRANGEBYSCORE key min max [WITHSCORES] 时间复杂度:O(log(N)+M) 返回值:区间内的元素列表。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANGEBYSCORE myzset -inf +inf
1) "one"
2) "two"
3) "three"
redis> ZRANGEBYSCORE myzset 1 2
1) "one"
2) "two"
redis> ZRANGEBYSCORE myzset (1 2
1) "two"
redis> ZRANGEBYSCORE myzset (1 (2
(empty array)
复制代码
ZPOPMAX
删除并返回分数最⾼的 count 个元素。 语法 ZPOPMAX key [count] 时间复杂度:O(log(N) * M) 返回值:分数和元素列表。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZPOPMAX myzset
1) "three"
2) "3"
复制代码
BZPOPMAX
ZPOPMAX 的阻塞版本。 语法
BZPOPMAX key [key ...] timeout 时间复杂度:O(log(N)) 返回值:元素列表。 举例
redis> DEL zset1 zset2
(integer) 0
redis> ZADD zset1 0 a 1 b 2 c
(integer) 3
redis> BZPOPMAX zset1 zset2 0
1) "zset1"
2) "c"
3) "2"
复制代码
ZPOPMIN
删除并返回分数最低的 count 个元素。 语法 ZPOPMIN key [count] 时间复杂度:O(log(N) * M) 返回值:分数和元素列表。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZPOPMIN myzset
1) "one"
2) "1"
复制代码
BZPOPMIN
ZPOPMIN 的阻塞版本。 语法 BZPOPMIN key [key ...] timeout 时间复杂度:O(log(N)) 返回值:元素列表。 举例
redis> DEL zset1 zset2
(integer) 0
redis> ZADD zset1 0 a 1 b 2 c
(integer) 3
redis> BZPOPMIN zset1 zset2 0
1) "zset1"
2) "a"
3) "0"
复制代码
ZRANK
返回指定元素的排名,升序。 语法 ZRANK key member 时间复杂度:O(log(N)) 返回值:排名。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANK myzset "three"
(integer) 2
redis> ZRANK myzset "four"
(nil)
redis> ZRANK myzset "three" WITHSCORE
1) (integer) 2
2) "3"
redis> ZRANK myzset "four" WITHSCORE
(nil)
复制代码
ZREVRANK
返回指定元素的排名,降序。 语法 ZREVRANK key member 时间复杂度:O(log(N)) 返回值:排名。
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREVRANK myzset "one"
(integer) 2
redis> ZREVRANK myzset "four"
(nil)
redis> ZREVRANK myzset "three" WITHSCORE
1) (integer) 0
2) "3"
redis> ZREVRANK myzset "four" WITHSCORE
(nil)
复制代码
ZSCORE
返回指定元素的分数。 语法 ZSCORE key member 时间复杂度:O(1) 返回值:分数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZSCORE myzset "one"
"1"
复制代码
ZREM
删除指定的元素。 语法 ZREM key member [member ...] 时间复杂度:O(M*log(N)) 返回值:本次操作删除的元素个数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREM myzset "two"
(integer) 1
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "three"
4) "3"
复制代码
ZREMRANGEBYRANK
按照排序,升序删除指定范围的元素,左闭右闭。 语法 ZREMRANGEBYRANK key start stop 时间复杂度:O(log(N)+M) 返回值:本次操作删除的元素个数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREMRANGEBYRANK myzset 0 1
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "three"
2) "3"
复制代码
ZREMRANGEBYSCORE
按照分数删除指定范围的元素,左闭右闭。 语法 ZREMRANGEBYSCORE key min max 时间复杂度:O(log(N)+M) 返回值:本次操作删除的元素个数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREMRANGEBYSCORE myzset -inf (2
(integer) 1
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "three"
4) "3"
复制代码
ZINCRBY
为指定的元素的关联分数添加指定的分数值。 语法 ZINCRBY key increment member 时间复杂度:O(log(N)) 返回值:增加后元素的分数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZINCRBY myzset 2 "one"
"3"
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "one"
4) "3"
复制代码
ZINTERSTORE
求出给定有序集合中元素的交集并生存进⽬标有序集合中,在归并过程中以元素为单位进⾏归并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。 语法 ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>] 时间复杂度:O(N*K)+O(M*log(M)) N 是输⼊的有序集合中, 最⼩的有序集合的元素个数; K 是输⼊了⼏个有序集合; M 是最终结果的有序集合的元素个数. 返回值:⽬标集合中的元素个数。 举例
redis> ZADD zset1 1 "one"
(integer) 1
redis> ZADD zset1 2 "two"
(integer) 1
redis> ZADD zset2 1 "one"
(integer) 1
redis> ZADD zset2 2 "two"
(integer) 1
redis> ZADD zset2 3 "three"
(integer) 1
redis> ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 2
redis> ZRANGE out 0 -1 WITHSCORES
1) "one"
2) "5"
3) "two"
4) "10"
复制代码
ZUNIONSTORE 求出给定有序集合中元素的并集并生存进⽬标有序集合中,在归并过程中以元素为单位进⾏归并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。 语法 ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>] 时间复杂度:O(N)+O(M*log(M)) N 是输⼊的有序集合总的元素个数; M 是最终结果的有序集合的元素个数. 返回值:⽬标集合中的元素个数。 举例
redis> ZADD zset1 1 "one"
(integer) 1
redis> ZADD zset1 2 "two"
(integer) 1
redis> ZADD zset2 1 "one"
(integer) 1
redis> ZADD zset2 2 "two"
(integer) 1
redis> ZADD zset2 3 "three"
(integer) 1
redis> ZUNIONSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 3
redis> ZRANGE out 0 -1 WITHSCORES
1) "one"
2) "5"
3) "three"
4) "9"
5) "two"
6) "10"
复制代码
内部编码
有序集合类型的内部编码有两种: • ziplist(压缩列表):当有序集合的元素个数⼩于 zset-max-ziplist-entries 设置(默认 128 个),同时每个元素的值都⼩于 zset-max-ziplist-value 设置(默认 64 字节)时,Redis 会⽤ ziplist 来作为有序集合的内部实现,ziplist 可以有效镌汰内存的使⽤。
• skiplist(跳表):当 ziplist 条件不满⾜时,有序集合会使⽤ skiplist 作为内部实现,由于此时ziplist 的操作效率会降落。
1)当元素个数较少且每个元素较⼩时,内部编码为 ziplist:
127.0.0.1:6379> zadd zsetkey 50 e1 60 e2 30 e3
(integer) 3
127.0.0.1:6379> object encoding zsetkey
"ziplist"
2)当元素个数高出 128 个,内部编码 skiplist:
127.0.0.1:6379> zadd zsetkey 50 e1 60 e2 30 e3 ... 省略 ... 82 e129
(integer) 129
127.0.0.1:6379> object encoding zsetkey
"skiplist"
3)当某个元素⼤于 64 字节时,内部编码 skiplist:
127.0.0.1:6379> zadd zsetkey 50 "one string bigger than 64 bytes ... 省略 ..."
(integer) 1
127.0.0.1:6379> object encoding zsetkey
"skiplist”
应用场景
1.排行榜 Zset非常适适用于实现各种排行榜,如游戏内的玩家排名、交际平台的热门帖子排名等。
元素可以是玩家的ID或帖子的ID,分数可以是玩家的积分或帖子的点赞数、评论数等。
可以利用ZRANGE或ZREVRANGE下令来获取排名前列的元素,或利用ZRANK或ZREVRANK下令来获取特定元素的排名。 2.延时队列 Zset可以用于实现延时队列,其中元素代表任务,分数代表任务的实行时间戳。
通过定期检查Zset中分数最小的元素(即最早应该实行的任务),可以实现任务的定时实行。
当任务实行后,可以从Zset中删除该元素。 欢迎大家访问我的主页---》 链接
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
小秦哥
金牌会员
这个人很懒什么都没写!
楼主热帖
Python教程(5)——Python的第一个程序 ...
Kubernetes(k8s)安装以及搭建k8s-Das ...
java递归简介说明
网易云信实时视频直播在TCP数据传输层 ...
〖Python接口自动化测试实战篇⑤〗- 接 ...
海量监控数据处理如何做,看华为云SRE ...
liunx速记
从 Stream 到 Kotlin 再到 SPL
开发一个二方包,优雅地为系统接入ELK ...
【问题】为什么 System.Timers.Timer ...
标签云
运维
CIO
存储
服务器
浏览过的版块
Oracle
分布式数据库
运维.售后
人工智能
快速回复
返回顶部
返回列表