图解Redis 05 | Zset数据类型的原理及应用场景
创作时间:
作者:
@小白创作中心
图解Redis 05 | Zset数据类型的原理及应用场景
引用
CSDN
1.
https://m.blog.csdn.net/weixin_42627385/article/details/143318224
Redis的Zset数据类型是一种有序集合,每个元素都有一个分数用于排序。这种数据结构在实现排行榜等需要频繁更新和排序的场景中非常有用。本文将详细介绍Zset的原理、实现方式以及具体应用场景。
介绍
Zset 类型(有序集合)与 Set 类型相比,增加了一个排序属性 score。对于有序集合 Zset,每个元素由两个部分组成:一个是元素的值,另一个是用于排序的分数 score。
有序集合继承了Set中成员唯一(元素值不能重复,分数可以重复)的特性,但不同之处在于,有序集合中的元素是按分数进行排序的。
内部实现
Zset 类型的底层数据结构可以采用ziplist或skiplist来实现:
- 当有序集合中的元素个数少于 128 个,并且每个元素的值小于 64 字节时,Redis 会使用ziplist作为 Zset 的底层数据结构。
- 如果不满足这些条件,Redis 则会使用skiplist来实现 Zset 的底层数据结构。
要注意的是,从 Redis 7.0 开始,压缩列表已被废弃,改用更高效的 listpack 数据结构来实现。
常用命令
添加一个或多个元素
zadd key [NX|XX] [CH] [INCR] score member [score member …]
# NX:仅当成员不存在时才添加。如果成员已经存在,什么都不做。
# CH:返回被成功修改的成员数,新增的成员和更新了分数的成员都将被计数。
# INCR:将给定分数递增到成员的当前分数上。如果成员不存在,ZADD 会像正常一样创建一个成员,并将分数设置为指定的值。
> zadd zset1 10 Java
(integer) 1
> zadd zset1 4 Golang 5 JavaScript 7 Python
(integer) 3
查询所有元素
zrange key start stop [WITHSCORES]
> zrange zset1 0 -1
1) "Golang"
2) "JavaScript"
3) "Python"
4) "Java"
其中,-1表示最后一个元素,查询结果包括开始和结束元素。
删除一个或多个元素(根据元素值)
zrem key member [member …]
> zrem zset1 Java Python
2
> zrange zset1 0 -1
1) "Golang"
2) "JavaScript"
在删除操作中,如果包含的元素不存在,该命令仍会正常执行;所有不存在的元素将被自动忽略。
查询某个元素的分数值
zscore key member
> zscore zset1 Golang
4.0
查询指定分数区间的元素
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
> zrangebyscore zset1 3 7
1) "Golang"
2) "JavaScript"
查询元素的排名
zrank key member
> zadd zset1 10 C++ 12 Ruby
(integer) 2
> zrank zset1 C++
2
> zrank zset1 Golang
0
可以看出排名都是从0开始的,排名可以理解为元素排序后的下标值。更多操作命令请参见文末部分。
应用场景
在需要展示最新榜单或排行榜的场景下,如果数据更新频繁或需要分页显示,建议优先使用 Zset(有序集合)。
排行榜
有序集合最典型的使用场景就是排行榜,例如学生成绩排行、游戏积分排行、视频播放排行、电商系统中产品销量排行等。
以文章点赞量排行为例,假设我发表了 3 篇文章,分别获得了 200、50 和 100 个点赞。
- arcticle:1 获得200个赞
> ZADD arcticle:ranking 200 arcticle:1
(integer) 1
- arcticle:2获得50个赞
> ZADD arcticle:ranking 50 arcticle:2
(integer) 1
- arcticle:3获得100个赞
> ZADD arcticle:ranking 100 arcticle:3
(integer) 1
- article:2又加了一个赞
> ZINCRBY arcticle:ranking 1 arcticle:2
51.0
- 查看某篇文章的点赞数
> ZSCORE arcticle:ranking arcticle:3
100.0
- 获取点赞数最多的2篇文章,
ZREVRANGE arcticle:ranking 0 1 WITHSCORES
1) "arcticle:1"
2) 200.0
3) "arcticle:3"
4) 100.0
- 获取点赞数在50~100的文章
ZRANGEBYSCORE arcticle:ranking 100 200 WITHSCORES
1) "arcticle:3"
2) 100.0
3) "arcticle:1"
4) 200.0
更多有序集合命令
1.查询有序集合的元素个数。
zcard key
> zcard arcticle:ranking
3
- 查询某个元素的逆序排名(从高到低的排名)。
zrevrank key member
> zrevrank arcticle:ranking arcticle:2
2
> zrange arcticle:ranking 0 -1
1) "arcticle:2"
2) "arcticle:3"
3) "arcticle:1"
- 删除指定排名范围内的元素
zremrangebyrank key start stop
> zremrangebyrank arcticle:ranking 0 1 #Delete element
(integer) 2
> zrange arcticle:ranking 0 -1 #Query all elements
1) "arcticle:1"
- 删除指定分数范围内的元素。
zremrangebyscore key min max
> ZADD arcticle:ranking 51 arcticle:2 100 arcticle:3
(integer) 2
> ZREVRANGE arcticle:ranking 0 -1 WITHSCORES
1) "arcticle:1"
2) 200.0
3) "arcticle:3"
4) 100.0
5) "arcticle:2"
6) 51.0
> zremrangebyscore arcticle:ranking 50 100
2
> ZREVRANGE arcticle:ranking 0 -1 WITHSCORES
1) "arcticle:1"
2) 200.0
热门推荐
糖尿病患者营养餐搭配,科学控糖新选择
杨振宁妻子翁帆探访刘诗昆夫妇,48岁依然青春焕发,已是双博学位
辉瑞和莫德纳疫苗的最佳接种间隔揭秘
耳朵里的长寿密码:从耳朵特征看健康
小米滑板车真空胎安装指南:4大步骤+3项维护要点
4000亿彩票市场催生查询工具,让开奖信息更安全便捷
“蔬菜人参”牛蒡:营养全面,八大功效守护健康
鸡胸肉、三文鱼、燕麦:富含维生素B6的护肤饮食推荐
低GI苹果燕麦片,糖尿病患者的福音
鸡蛋灌饼制作详解:4个步骤+4个技巧,轻松做出完美口感
检警律师三方博弈,张若昀焦俊艳主演《完美证据》
禅宗祖庭南华寺:惠能真身塔见证千年禅文化
荷兰4.6万双胞胎30年研究:幸福感U型变化与遗传影响
斑丘疹来袭,教你快速应对
笑里藏刀:源自唐朝的成语与三十六计解析
从安全到能效:家电产品五大质检标准详解
胃泌素17检测:探索胃部健康的秘密信使
王昭君出塞:一段传奇的匈奴之旅
2025高考:考场“鸦雀无声”,新规严明纪律
胡萝卜:营养丰富的全能蔬菜
重庆自然博物馆90周年:从卢作孚的科学梦想到科普教育的摇篮
世卫组织警告:青少年饮酒致肝病发病率飙升
分部积分法:正割函数积分的利器
科学预防老年人晕车:7个实用方法让出行更安全舒适
秋冬滋阴养生指南:从饮食到穴位按摩
德乙第17轮:杜塞尔多夫主场迎战“客场龙”马格德堡,谁能笑到最后?
漠北之战:汉武帝的辉煌胜利
揭秘道光皇帝的致命决策:清朝衰败的幕后黑手
高中英语学习指南:六大方法助你稳步提升
阳光周末,河边垂钓:一段父子亲情的温馨记录