Redis 常用数据类型之 zset

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis 常用数据类型之 zset

一、zset数据结构

相比于set,sorted set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,还可以通过 score 的范围来获取元素的列表。

zset有两种不同的实现,分别是zipList和skipList。

zipList:

满足以下两个条件:

  • [score,value]键值对数量少于128个;
  • 每个元素的长度小于64字节;

skipList:

不满足以上两个条件时使用跳表(组合了hash和skipList)

  • hash用来存储value到score的映射,这样就可以在O(1)时间内找到value对应的分数;
  • skipList按照从小到大的顺序存储分数;
  • skipList每个元素的值都是[score,value]对

二、Redis的zset

Redis 中 zset 不是单一结构完成,是跳表和哈希表共同完成。

实现方式:Redis sorted set的内部使用HashMap和跳跃表(skipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

使用zipList的示意图如下所示:

使用跳表时的示意图:

hash用于记录权重

ps:跳表介绍可以参考如下文章

Redis 跳跃表的原理和实现_redis跳表原理_击水三千里的博客-CSDN博客

三、详细操作

基础操作(zadd、zcrad、zcount)

127.0.0.1:6379> zadd books 49 java 79 springboot 80 python 50 php        # 添加元素
(integer) 4
127.0.0.1:6379> zadd books 30 java2
(integer) 1
127.0.0.1:6379> zcard books                                              # 查看数量
(integer) 5
127.0.0.1:6379> zcount books 0 3                                         # 根据分数显示指定的元素,有没有分数在 0 到 3 的数据,这里就返回 0
(integer) 0
127.0.0.1:6379> zcount books 0 70                                        # 返回分数在 0 到 70 之间的数据
(integer) 3
127.0.0.1:6379>

排序操作(zrange 、zrevrange )

127.0.0.1:6379>zrange books 0 -1                                        # 顺序查询集合中的成员
1) "java2"
2) "java"
3) "php"
4) "springboot"
5) "python"
127.0.0.1:6379> zrevrange books 0 -1                                     # 倒序查看集合中的成员
1) "python"
2) "springboot"
3) "php"
4) "java"
5) "java2"
127.0.0.1:6379>

根据分数显示元素(zrangebyscore

这里有一个内置值 inf,表示无穷,  -inf 表示负无穷, +inf 表示正无穷

127.0.0.1:6379> zrangebyscore books -inf +inf                # 显示元素从大到小排序
1) "java2"
2) "java"
3) "php"
4) "springboot"
5) "python"
127.0.0.1:6379> zrangebyscore books -inf +inf withscores     # 显示元素从大到小,并且附带成绩
 1) "java2"
 2) "30"
 3) "java"
 4) "49"
 5) "php"
 6) "50"
 7) "springboot"
 8) "79"
 9) "python"
10) "80"
127.0.0.1:6379> zrangebyscore books -inf 50 withscores        # 显示元素 <= 50 的那部分
1) "java2"
2) "30"
3) "java"
4) "49"
5) "php"
6) "50"
127.0.0.1:6379>

删除操作(zrem、zremrangebyrank、zremrangebyscore)

127.0.0.1:6379> zrem books java                    # 删除指定元素
(integer) 1
127.0.0.1:6379> zrange books 0 -1
1) "java2"
2) "php"
3) "springboot"
4) "python"
127.0.0.1:6379> zremrangebyrank books 0 -1         # 根据数组下标删除指定的元素
(integer) 4
127.0.0.1:6379> zrange books 0 -1
(empty list or set)
127.0.0.1:6379>
127.0.0.1:6379> zadd mysort 10 key1 20 key2 30 key3 40 key4            #  重新添加集合元素
(integer) 4
127.0.0.1:6379> zadd mysort 10 key5 30 key6
(integer) 2
127.0.0.1:6379> zrange mysort 0 -1                                     # 查看集合中的元素
1) "key1"
2) "key5"
3) "key2"
4) "key3"
5) "key6"
6) "key4"
127.0.0.1:6379> zremrangebyrank mysort 0 2                            # 根据数组的下标来删除元素
(integer) 3
127.0.0.1:6379> zrange mysort 0 -1
1) "key3"
2) "key6"
3) "key4"
127.0.0.1:6379> zrangebyscore mysort -inf +inf WITHSCORES
1) "key3"
2) "30"
3) "key6"
4) "30"
5) "key4"
6) "40"
127.0.0.1:6379> zremrangebyscore mysort 0 1                         # 根据分数来删除,但是此时没有分数满足 0 到 1 删除的结果就为 0
(integer) 0
127.0.0.1:6379> zrange mysort 0 -1                                  # 再次查看
1) "key3"
2) "key6"
3) "key4"
127.0.0.1:6379> zremrangebyscore mysort 0 35                        # 再次根据分数来删除
(integer) 2
127.0.0.1:6379> zrange mysort 0 -1
1) "key4"
127.0.0.1:6379>


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
8天前
|
存储 消息中间件 NoSQL
使用Java操作Redis数据类型的详解指南
通过使用Jedis库,可以在Java中方便地操作Redis的各种数据类型。本文详细介绍了字符串、哈希、列表、集合和有序集合的基本操作及其对应的Java实现。这些示例展示了如何使用Java与Redis进行交互,为开发高效的Redis客户端应用程序提供了基础。希望本文的指南能帮助您更好地理解和使用Redis,提升应用程序的性能和可靠性。
22 1
|
28天前
|
存储 消息中间件 NoSQL
Redis 数据类型
10月更文挑战第15天
36 1
|
19天前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
19天前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
2月前
|
存储 消息中间件 缓存
深入探析Redis常见数据类型及应用场景
深入探析Redis常见数据类型及应用场景
53 2
|
3月前
|
NoSQL 安全 Java
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
这篇文章深入探讨了Redis中的String数据类型,包括键操作的命令、String类型的命令使用,以及String在Redis中的内部数据结构实现。
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
|
2月前
|
存储 NoSQL API
7)深度解密 Redis 的有序集合(ZSet)
7)深度解密 Redis 的有序集合(ZSet)
41 0
|
3月前
|
存储 NoSQL 算法
Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。
|
3月前
|
消息中间件 存储 NoSQL
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
本文档介绍了如何使用 Go 语言中的 `go-redis` 库操作 Redis 数据库
175 0
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
|
3月前
|
存储 缓存 NoSQL
Redis深度解析:部署模式、数据类型、存储模型与实战问题解决
Redis深度解析:部署模式、数据类型、存储模型与实战问题解决