文章目录
- 1. 引言
 - 2. redis 源码下载
 - 3. redisObject 管理 ZSet 类型的数据结构
 - 4. 参考
 
1. 引言
前情提要:
 《redis 从0到1完整学习 (一):安装&初识 redis》
 《redis 从0到1完整学习 (二):redis 常用命令》
 《redis 从0到1完整学习 (三):redis 数据结构》
 《redis 从0到1完整学习 (四):字符串 SDS 数据结构》
 《redis 从0到1完整学习 (五):集合 IntSet 数据结构》
 《redis 从0到1完整学习 (六):Hash 表数据结构》
 《redis 从0到1完整学习 (七):ZipList 数据结构》
 《redis 从0到1完整学习 (八):QuickList 数据结构》
 《redis 从0到1完整学习 (九):SkipList 数据结构》
 《redis 从0到1完整学习 (十):RedisObject 数据结构》
 《redis 从0到1完整学习 (十一):RedisObject 之 String 类型》
 《redis 从0到1完整学习 (十二):RedisObject 之 List 类型》
 《redis 从0到1完整学习 (十三):RedisObject 之 Set 类型》
上一节整体讲了 RedisObject 的数据结构,能灵活地处理不同类型和大小的数据,本文主要介绍 RedisObject 是如何管理 ZSet 类型的数据结构的。
2. redis 源码下载
Redis 源码可以点击这里下载,方便查看其中定义的一些数据结构。
 
3. redisObject 管理 ZSet 类型的数据结构
Redis 中的 ZSet(Sorted Set)是一种特殊的数据结构,它将集合(Set)和有序列表(Sorted List)的概念结合在一起。ZSet 中的每个成员都有一个分数(score),这个分数可以是任何类型的浮点数,用于对集合中的元素进行排序。
在 Redis 中,ZSet 的数据结构特性如下:
- 成员唯一性:与 Set 类似,ZSet 中不允许重复的成员,即使它们的分数不同。
 - 有序性:ZSet 中的成员按照其对应的分数值从小到大排序。
 - 操作丰富:支持增删改查、范围查询等丰富的操作,如 ZADD(添加元素及其分数)、ZREM(删除元素)、ZRANGE(获取指定范围内成员及分数)、ZINCRBY(增加成员的分数)、ZREVRANGE(反向获取指定范围内成员及分数)等。
 - 高效性:ZSet 采用跳表(SkipList)和哈希表(HashMap)相结合的方式实现,保证了插入、删除、查找等操作的高效性。
 
下面是 ZSet 的数据结构:
 
 跳表和 Hash 表的结构可以参考之前的文章:
 《redis 从0到1完整学习 (九):SkipList 数据结构》
 《redis 从0到1完整学习 (六):Hash 表数据结构》
RedisObject 的 ZSet 数据结构如下:
 
 Hash 用于进行查询,SkipList 用于排序。但是内部保存了两份数据,更耗费内存。
当元素数量不多时,ZSet 采用 ZipList 结构来节省内存,不过需要同时满足两个条件:
- 元素数量小于 
zset_max_ziplist_entries,默认值128 - 每个元素都小于 
zset_max_ziplist_value字节,默认值64 
这种情况下:
- score 和 element 是紧接着放在一起的两个 entry
 - 从队首到队尾按照 score 升序排列
 - 需要找元素,则遍历 ZipList,因为元素不多,所以效率可控
 
这种情况下,RedisObject 实现 ZSet 的数据结构如下:
 
 而当不满足 zset_max_ziplist_entries 和 zset_max_ziplist_value 的要求时,则 ZipList 会转换到 SkipList + Hash 表!
4. 参考
《redis 从0到1完整学习 (一):安装&初识 redis》
 《redis 从0到1完整学习 (二):redis 常用命令》
 《redis 从0到1完整学习 (三):redis 数据结构》
 《redis 从0到1完整学习 (四):字符串 SDS 数据结构》
 《redis 从0到1完整学习 (五):集合 IntSet 数据结构》
 《redis 从0到1完整学习 (六):Hash 表数据结构》
 《redis 从0到1完整学习 (七):ZipList 数据结构》
 《redis 从0到1完整学习 (八):QuickList 数据结构》
 《redis 从0到1完整学习 (九):SkipList 数据结构》
 《redis 从0到1完整学习 (十):RedisObject 数据结构》
 《redis 从0到1完整学习 (十一):RedisObject 之 String 类型》
 《redis 从0到1完整学习 (十二):RedisObject 之 List 类型》
 《redis 从0到1完整学习 (十三):RedisObject 之 Set 类型》



![[Echarts使用]:bug记录](https://img-blog.csdnimg.cn/direct/138ffaf4f4ac45929bf2fd2e54cb1262.jpeg)















