redis 从0到1完整学习 (十四):RedisObject 之 ZSet 类型
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 类型》
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!