redis 从0到1完整学习 (十四):RedisObject 之 ZSet 类型

文章目录

  • 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_entrieszset_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 类型》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/314339.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python开发环境[PycharmEclipseAnaconda]

Pycharm配置Python开发环境 每种语言的开发工具都有很多,如果写一些小的脚本或者小的工具,建议直接使用命令行或者Python自带的IDLE,如果进行大型的开发工作建议使用Pycharm,当然这属于个人喜好。 虽然Pycharm给了我们一个美观的…

K8s实战入门

1.NameSpace Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相…

Iterator(迭代器) 和 list

Iterator(迭代器) 和 list 文章目录 一、Iterator(迭代器)二、list 提示:以下是本篇文章正文内容,下面案例可供参考 一、Iterator(迭代器) 对 collection 进行迭代的迭代器。迭代器…

【Unity入门】UGUI之Slider(滑动条)

目录 一、什么是Slider?二、Slider属性与功能 一、什么是Slider? Slider控件允许用户可以通过鼠标来在预先确定的范围调节数值 我们可以在Hierarchy视图右键 -> UI ->Slider来创建滑动条 通过上图可以发现Unity内置的Slider主要有3部分&#x…

互斥锁-第二十七天

互斥锁 定义:解决临界区最简单的工具(一个进程在进入临界区时应获得锁;在退出临界区时释放锁。函数acquire()获得锁,release()释放锁) 注意事项:acquire()或release()的执行必须是原子操作,因…

createElement, parentNode, removeChild, appendChild

1获取父节点 var childNode document.getElementById("child"); var parentNode childNode.parentNode; // 获取父节点利用dom获取元素要嵌套 引出:利用父子兄节点关系获取元素 标签,元素,元素节点空格,文本节点属性…

buildadmin实现多级关联下拉效果

文章目录 最终效果开始重新渲染组件编辑渲染完结 最终效果 开始 popupForm.vue代码 <FormItem :label"t(interior.interiorApply.interior_index_id)" type"remoteSelect"v-model"baTable.form.items!.interior_index_id" prop"interi…

Vue:使用IDEA开发Vue的相关配置

一、IDEA无法识别.vue文件 1、IDEA 添加Vue插件 2、添加Vue配置 File | Settings | Editor | File Types 找到 HTML 文件 在下面点号 输入*.vue 二、IDEA无法创建.vue文件 1、问题 在开发过程中&#xff0c;发现创建文件的界面&#xff0c;没有vue模板 2、相关配置 Fi…

MySql——1146 - Table‘mysql.proc‘doesn‘t exit是这个

项目场景&#xff1a; 做自己的小项目需要连接mysql数据库 问题描述 点击数据库时报错 1146 - Table’mysql.proc’doesn’t exit 原因分析&#xff1a; 误删原生的mysql数据库 解决方案&#xff1a; 重新安装装部署mysql就好了 注意不要轻易删除原生的东西

57.网游逆向分析与插件开发-游戏增加自动化助手接口-接管游戏的自动药水设定功能

内容来源于&#xff1a;易道云信息技术研究院VIP课 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;51307d6bf69f2f3c645c70d09f841f5e32da79b9 代码下载地址&#xff0c;在 SRO_EX 目录下&…

PiflowX组件-ReadFromUpsertKafka

ReadFromUpsertKafka组件 组件说明 upsert方式从Kafka topic中读取数据。 计算引擎 flink 有界性 Unbounded 组件分组 kafka 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子kafka_hostKAFKA_HO…

2023-12-11 LeetCode每日一题(最小体力消耗路径)

2023-12-11每日一题 一、题目编号 1631. 最小体力消耗路径二、题目链接 点击跳转到题目位置 三、题目描述 你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights &#xff0c;其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格…