「Redis」五大常见的数据类型之 Zset
mhr18 2024-12-05 13:35 30 浏览 0 评论
前言
我们都知道 Redis 提供了丰富的数据类型,常见的有五种:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。
今天我们就来详细地聊聊 Redis 这五大常见的数据类型之一 Zset;
结构类型 | 结构存储的值 | 结构读写能力 |
Zset | 包含字符串的有序集合; | 字符串成员与浮点数分数之间的有序映射; |
应用场景:排序场景,比如排行榜、电话和姓名排序等。
概述简介
Zset 类型(有序集合类型)相比于 Set 类型多了一个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序结合的元素值,一个是排序值。
有序集合保留了集合不能有重复成员的特性(分值可以重复),但不同的是,有序集合中的元素可以排序。
内部实现
Zset 类型的底层数据结构是由压缩列表或跳表实现的:
- 如果有序集合的元素个数小于 128 个,并且每个元素的值小于 64 字节时,Redis 会使用压缩列表作为 Zset 类型的底层数据结构;
- 如果有序集合的元素不满足上面的条件,Redis 会使用跳表作为 Zset 类型的底层数据结构;
在 Redis 7.0 中,压缩列表数据结构已经废弃了,交由 listpack 数据结构来实现了。
常用命令
Zset 常用操作:
# 往有序集合 key 中加入带分值元素
# ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
127.0.0.1:6379> ZADD usr:score 63 甲 70 乙 82 丙 89 丁 92 戊
(integer) 5
# 正序获取有序集合 key 从 start 下标到 stop 下标的元素
# ZRANGE key start stop [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
127.0.0.1:6379> ZRANGE usr:score 0 -1
1) "\xe7\x94\xb2"
2) "\xe4\xb9\x99"
3) "\xe4\xb8\x99"
4) "\xe4\xb8\x81"
5) "\xe6\x88\x8a"
# 倒序获取有序集合 key 从 start 下标到 stop 下标的元素
# ZREVRANGE key start stop [WITHSCORES]
127.0.0.1:6379> ZREVRANGE usr:score 0 -1
1) "\xe6\x88\x8a"
2) "\xe4\xb8\x81"
3) "\xe4\xb8\x99"
4) "\xe4\xb9\x99"
5) "\xe7\x94\xb2"
# 往有序集合 key 中删除元素
# ZREM key member [member...]
127.0.0.1:6379> ZREM usr:score "\xe4\xb8\x99"
(integer) 1
# 返回有序集合 key 中元素 member 的分值
# ZSCORE key member
127.0.0.1:6379> ZSCORE usr:score "\xe4\xb9\x99"
"70"
# 返回有序集合 key 中元素个数
# ZCARD key
127.0.0.1:6379> ZCARD usr:score
(integer) 4
# 为有序集合 key 中元素 member 的分值加上 increment
# ZINCRBY key increment member
127.0.0.1:6379> ZINCRBY usr:score 11 "\xe4\xb9\x99"
"81"
# 返回有序集合中指定分数区间内的成员,分数由低到高排序。
# ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
127.0.0.1:6379> ZRANGEBYSCORE usr:score 79 90
1) "\xe4\xb9\x99"
2) "\xe4\xb8\x81"
# 返回指定成员区间内的成员,按字典正序排列, 分数必须相同。
# ZRANGEBYLEX key min max [LIMIT offset count]
127.0.0.1:6379> ZADD zset 0 a 0 aa 0 abc 0 apple 0 b 0 c 0 d 0 d1 0 dd 0 dobble 0 z 0 z1
(integer) 12
127.0.0.1:6379> ZRANGEBYLEX zset - +
1) "a"
2) "aa"
3) "abc"
4) "apple"
5) "b"
6) "c"
7) "d"
8) "d1"
9) "dd"
10) "dobble"
11) "z"
12) "z1"
127.0.0.1:6379> ZRANGEBYLEX zset - + LIMIT 0 3
1) "a"
2) "aa"
3) "abc"
# 返回指定成员区间内的成员,按字典倒序排列, 分数必须相同
# ZREVRANGEBYLEX key max min [LIMIT offset count]
127.0.0.1:6379> ZREVRANGEBYLEX zset + -
1) "z1"
2) "z"
3) "dobble"
4) "dd"
5) "d1"
6) "d"
7) "c"
8) "b"
9) "apple"
10) "abc"
11) "aa"
12) "a"
Zset 运算操作(相比于 Set 类型,ZSet 类型没有支持差集运算):
# 并集计算(相同元素分值相加),numberkeys一共多少个key,WEIGHTS每个key对应的分值乘积
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
# 交集计算(相同元素分值相加),numberkeys一共多少个key,WEIGHTS每个key对应的分值乘积
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
应用场景
Zset 类型(Sorted Set,有序集合) 可以根据元素的权重来排序,我们可以自己来决定每个元素的权重值。比如说,我们可以根据元素插入 Sorted Set 的时间确定权重值,先插入的元素权重小,后插入的元素权重大。
在面对需要展示最新列表、排行榜等场景时,如果数据更新频繁或者需要分页显示,可以优先考虑使用 Sorted Set。
排行榜
有序集合比较典型的使用场景就是排行榜。例如学生成绩的排名榜、游戏积分排行榜、视频播放排名、电商系统中商品的销量排名等。
我们以商品销售量为例,分别有五种商品,销售量为1243,321,98,432,2394;
# sale:1 商品的销售量为1243,以此类推
127.0.0.1:6379> ZADD mall 1243 sale:1
(integer) 1
127.0.0.1:6379> ZADD mall 321 sale:2
(integer) 1
127.0.0.1:6379> ZADD mall 98 sale:3
(integer) 1
127.0.0.1:6379> ZADD mall 432 sale:4
(integer) 1
127.0.0.1:6379> ZADD mall 2394 sale:5
(integer) 1
商品 sale:3 又卖出了一个,那么可以使用 ZINCRBY 命令(为有序集合 key 中元素 member 的分值加上 increment):
127.0.0.1:6379> ZINCRBY mall 1 sale:3
"99"
查看某个商品的销售量,可以使用 ZSCORE 命令(返回有序集合 key 中元素个数):
127.0.0.1:6379> ZSCORE mall sale:1
"1243"
获取销售量前三的商品,可以使用 ZREVRANGE 命令(倒序获取有序集合 key 从 start 下标到 stop 下标的元素):
# WITHSCORES 表示把 score 也显示出来
127.0.0.1:6379> ZREVRANGE mall 0 2 WITHSCORES
1) "sale:5"
2) "2394"
3) "sale:1"
4) "1243"
5) "sale:4"
6) "432"
获取销售量在 300 到 1000 的商品,可以使用 ZRANGEBYSCORE 命令(返回有序集合中指定分数区间内的成员,分数由低到高排序):
127.0.0.1:6379> ZRANGEBYSCORE mall 300 1000
1) "sale:2"
2) "sale:4"
电话、姓名排序
使用有序集合的 ZRANGEBYLEX 或 ZREVRANGEBYLEX 可以帮助我们实现电话号码或姓名的排序,我们以 ZRANGEBYLEX (返回指定成员区间内的成员,按 key 正序排列,分数必须相同)为例。
注意:不要在分数不一致的 SortSet 集合中去使用 ZRANGEBYLEX和 ZREVRANGEBYLEX 指令,因为获取的结果会不准确。
1、电话排序
我们可以将电话号码存储到 SortSet 中,然后根据需要来获取号段:
127.0.0.1:6379> ZADD phone 0 13100111100 0 13110114300 0 13132110901
(integer) 3
127.0.0.1:6379> ZADD phone 0 13200111100 0 13210414300 0 13252110901
(integer) 3
127.0.0.1:6379> ZADD phone 0 13300111100 0 13310414300 0 13352110901
(integer) 3
获取所有号码:
127.0.0.1:6379> ZRANGEBYLEX phone - +
1) "13100111100"
2) "13110114300"
3) "13132110901"
4) "13200111100"
5) "13210414300"
6) "13252110901"
7) "13300111100"
8) "13310414300"
9) "13352110901"
获取 132 号段的号码:
127.0.0.1:6379> ZRANGEBYLEX phone [132 (133
1) "13200111100"
2) "13210414300"
3) "13252110901"
获取132、133号段的号码:
127.0.0.1:6379> ZRANGEBYLEX phone [132 (134
1) "13200111100"
2) "13210414300"
3) "13252110901"
4) "13300111100"
5) "13310414300"
6) "13352110901"
2、姓名排序
127.0.0.1:6379> zadd names 0 Toumas 0 Jake 0 Bluetuo 0 Gaodeng 0 Aimini 0 Aidehua
(integer) 6
获取所有人的名字:
127.0.0.1:6379> ZRANGEBYLEX names - +
1) "Aidehua"
2) "Aimini"
3) "Bluetuo"
4) "Gaodeng"
5) "Jake"
6) "Toumas"
获取名字中大写字母 A 开头的所有人:
127.0.0.1:6379> ZRANGEBYLEX names [A (B
1) "Aidehua"
2) "Aimini"
获取名字中大写字母 C 到 Z 的所有人:
127.0.0.1:6379> ZRANGEBYLEX names [C [Z
1) "Gaodeng"
2) "Jake"
3) "Toumas"
后记
Redis 五大常见数据类型之一的 Zset 就先讲到这里了,后续还会有其他类型的讲解呢,敬请关注!
参考资料:
- 《Redis 核心技术与实战》
- 一文回顾 Redis 五大对象 (数据类型)
- 谈谈Redis五种数据结构及真实应用场景
- Redis的数据结构与应用场景
- Redis 常见数据类型和应用场景
以上就是 【Redis】五大常见的数据类型之 Zset 的所有内容了,创作不易,多多支持
- 上一篇:图解 Redis 数据结构—跳跃表
- 下一篇:2022年Java中小厂面试记录
相关推荐
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
- 备份软件调用rman接口备份报错RMAN-06820 ORA-17629 ORA-17627
-
一、报错描述:备份归档报错无法连接主库进行归档,监听问题12541RMAN-06820:WARNING:failedtoarchivecurrentlogatprimarydatab...
- 增量备份修复物理备库gap(增量备份恢复数据库步骤)
-
适用场景:主备不同步,主库归档日志已删除且无备份.解决方案:主库增量备份修复dg备库中的gap.具体步骤:1、停止同步>alterdatabaserecovermanagedstand...
- 一分钟看懂,如何白嫖sql工具(白嫖数据库)
-
如何白嫖sql工具?1分钟看懂。今天分享一个免费的sql工具,毕竟现在比较火的NavicatDbeaverDatagrip都需要付费才能使用完整功能。幸亏今天有了这款SQLynx,它不仅支持国内外...
- 「开源资讯」数据管理与可视化分析平台,DataGear 1.6.1 发布
-
前言数据齿轮(DataGear)是一款数据库管理系统,使用Java语言开发,采用浏览器/服务器架构,以数据管理为核心功能,支持多种数据库。它的数据模型并不是原始的数据库表,而是融合了数据库表及表间关系...
- 您还在手工打造增删改查代码么,该神器带你脱离苦海
-
作为Java开发程序,日常开发中,都会使用Spring框架,完成日常的功能开发;在相关业务系统中,难免存在各种增删改查的接口需求开发。通常来说,实现增删改查有如下几个方式:纯手工打造,编写各种Cont...
- Linux基础知识(linux基础知识点及答案)
-
系统目录结构/bin:命令和应用程序。/boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev:dev是Device(设备)的缩写,该目录...
- PL/SQL 杂谈(二)(pl/sql developer使用)
-
承接(一)部分。我们从结构和功能这两个方面展示PL/SQL的关键要素。可以看看PL/SQL的优雅的代码。写出一个好的代码,就和文科生写出一篇优秀的作文一样,那么赏心悦目。1、与SQL的集成PL/S...
- 电商ERP系统哪个好用?(电商erp哪个好一点)
-
电商ERP系统哪个好用?做电商的,谁还没被ERP折腾过?有老板说:“我们早就上了ERP,订单、库存、财务全搞定,系统用得飞起。”也有运营吐槽:“系统是上了,可库存老不准,订单漏单错单天天有,财务对账还...
- 汽车检测线系统实例,看集中控制与PLC分布控制
-
PLC可编程控制器,上个世纪70年代初,为取代早期继电器控制线路,开始采取存储指令方式,完成顺序控制而设计的。开始仅有逻辑运算、计时、计数等简单功能。随着微处理的发展,PLC可编程能力日益提高,已经能...
- 苹果五件套成公司年会奖品主角,几大小技巧教你玩转苹果新品
-
钱江晚报·小时新闻记者张云山随着春节的临近,各家大公司的年会又将陆续上演。上周,各大游戏公司的年会大奖,苹果五件套又成了标配。在上海的游戏公司中,莉莉丝奖品列表拉得相当长,从特等奖到九等奖还包含了特...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)