Redis底层数据结构之IntSet

目录

    • 一、概述
    • 二、IntSet结构
    • 三、自动升级

redis底层数据结构已完结👏👏👏:

  • ☑️redis底层数据结构之SDS
  • ☑️redis底层数据结构之ziplist
  • ☑️redis底层数据结构之quicklist
  • ☑️redis底层数据结构之Dict
  • ☑️redis底层数据结构之IntSet
  • ☑️redis底层数据结构之ZSkipList

一、概述

IntSet是一个存储整数值的集合,内部使用有序、无重复的数组保存数据。优点:节省内存空间。高效的查找、插入和删除操作。使用场景: 在集合键只包含整数值且数量较少时使用。

二、IntSet结构

typedef struct intset {uint32_t encoding;uint32_t length;int8_t contents[];
} intset;#define INTSET_ENC_INT16 (sizeof(int16_t))
#define INTSET_ENC_INT32 (sizeof(int32_t))
#define INTSET_ENC_INT64 (sizeof(int64_t))

encoding: 数据编码,表示intset中的每个数据元素用几个字节来存储。它有三种可能的取值:INTSET_ENC_INT16表示每个元素用2个字节存储,INTSET_ENC_INT32表示每个元素用4个字节存储,INTSET_ENC_INT64表示每个元素用8个字节存储。因此,intset中存储的整数最多只能占用64bit。

length: 表示intset中的元素个数。encoding和length两个字段构成了intset的头部(header)。

contents: 是一个柔性数组(flexible array member),表示intset的header后面紧跟着数据元素。这个数组的总长度(即总字节数)等于encoding * length。柔性数组在Redis的很多数据结构的定义中都出现过(例如sds, quicklist, skiplist),用于表达一个偏移量。contents需要单独为其分配空间,这部分内存不包含在intset结构当中

在这里插入图片描述

说明:

  • 新创建的intset只有一个header,总共8个字节。其中encoding = 2, length = 0。
  • 添加13, 5两个元素之后,因为它们是比较小的整数,都能使用2个字节表示,所以encoding不变,值还是2。
  • 当添加32768的时候,它不再能用2个字节来表示了(2个字节能表达的数据范围是-215~215-1,而32768等于215,超出范围了),因此encoding必须升级到INTSET_ENC_INT32(值为4),即用4个字节表示一个元素。
  • 在添加每个元素的过程中,intset始终保持从小到大有序
  • 与ziplist类似,intset也是按小端(little endian)模式存储的(参见维基百科词条Endianness)。比如,在上图中intset添加完所有数据之后,表示encoding字段的4个字节应该解释成0x00000004,而第5个数据应该解释成0x000186A0 = 100000。

intset与ziplist相比:

  • ziplist可以存储任意二进制串,而intset只能存储整数。
  • ziplist是无序的,而intset是从小到大有序的。因此,在ziplist上查找只能遍历,而在intset上可以进行二分查找,性能更高。
  • ziplist可以对每个数据项进行不同的变长编码(每个数据项前面都有数据长度字段len),而intset只能整体使用一个统一的编码(encoding)。

三、自动升级

当在一个int16类型的整数集合中插入一个int32类型的值,整个集合的所有元素都会转换成32类型。 整个过程有三步:

  • 根据新元素的类型(比如int32),扩展整数集合底层数组的空间大小,并为新元素分配空间。
  • 将底层数组现有的所有元素都转换成与新元素相同的类型, 并将类型转换后的元素放置到正确的位上, 而且在放置元素的过程中, 需要继续维持底层数组的有序性质不变。
  • 最后改变encoding的值,length+1。

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

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

相关文章

java中switch条件语句的用法、switch的三种语法、switch支持的参数类型

文章目录 一、switch的应用场景二、switch三种语法2.1、switch 标准方式2.2、switch - > 用法2.2、switch yield 用法 三、什么是case穿透?四、示例4.1、标准示例4.2、错误示例4.3、引申用法(多条件合并) 一、switch的应用场景 在分支结构…

Elasticsearch概念 使用docker安装Elasticsearch和kibana

目录 一、Elasticsearch概念 倒排索引和正向索引 正向和倒排 二、ES安装 三、安装 kibana 四、IK分词器 下载ES中文分词器 扩展或停用词条 一、Elasticsearch概念 倒排索引和正向索引 正向索引 就像在mysql数据中搜索非主键字段的内容,就需要逐条数据的去查…

WEB攻防-.NET特性常见漏洞

目录 前置知识: DLL文件 .NET和DLL文件 C#和DLL文件 关系总结 .NET 配置调试-信息泄露 .NET 源码反编译-DLL 反编译与未授权访问 编译DLL文件 反编译DLL文件 注意事项 案例: 验证代码文件有没有可以绕过(Cookie&Session&…

【C++】二叉树的进阶

二叉树的进阶 二叉搜索树概念操作实现创建树形结构拷贝构造函数构造函数析构函数赋值运算符重载循环版本查找插入删除 递归版本查找插入删除 应用K模型KV模型性能分析 二叉树进阶面试题二叉树创建字符串二叉树的分层遍历I最近公共祖先二叉搜索树与双向链表前序遍历与中序遍历构…

PyCharm 无法运行的解决方案

问题: PyCharm 无法运行,该怎么办? 解决方案: 1. 检查 Python 解释器 确保已为 PyCharm 配置正确的 Python 解释器。打开 PyCharm,转到“文件”>“设置”>“项目”>“Python 解释器”。选择所需的 Python …

数组和指针经典笔试题讲解下

目录 创作不易,如对您帮助,还望一键三连,谢谢!!! 题目一: 题目二: 题目三: 题目四: 题目五: 题目六: 题目七: 创作…

震惊!某省图书馆竟然可以注册后直接访问知网并下载文章?

四川省图书馆 使用说明 1.点击进入https://portal.sclib.org/interlibSSO/main/main.jsp 显示如下: 2.关注四川省图书馆公众号并注册 3.点击馆外登录并使用刚注册的用户名密码登录 显示如下: 4.登录成功后跳转至首页并点击cnki即可正常使用

2024年最新一线互联网企业高级软件测试工程师面试题大全

1、功能测试 功能测试是游戏测试中跟“玩游戏”最相关的一个环节。 当然这里的“玩”不是要真的让你感受快乐,而是要通过“玩”游戏,发现存在的问题或不合理的地方。因此,这个“玩”的过程基本不会感受到游戏的乐趣。事实上,每一次…

低代码+定制物资管理:创新解决方案探析

引言 在当今快速变化的商业环境中,企业面临着不断增长的挑战,如提高效率、降低成本、满足客户需求等。为了应对这些挑战,企业需要不断创新并采用先进的技术解决方案。在这样的背景下,低代码开发和定制化物资管理成为了引领企业变…

【3GPP】【核心网】【5G】5G核心网协议解析(四)(超详细)

1. 欢迎大家订阅和关注,精讲3GPP通信协议(2G/3G/4G/5G/IMS)知识点,专栏会持续更新中.....敬请期待! 目录 1. NGAP 按流程功能分类 1.1 接口管理过程 1.1.1 NG Setup 1.2.1 NAS消息传输过程 Transport of NAS Messa…

Android 14设置android:importantForAutofill=“no“无效

密码输入框EditText不希望弹出Google的是否保存密码弹出框, 直接设置了android:importantForAutofill"no", android:inputType"textPassword|textNoSuggestions"在安卓12手机上有效,但是在安卓14上面就不行了&#xff0…

记一次JSON.toJSONString()转换时非属性方法空指针异常排查及toJSONString保留null值属性

记一次JSON.toJSONString()转换时非属性方法空指针异常排查及toJSONString保留null值属性 异常详情 有一个类,里面有两个属性和一个类似工具的getRealName()方法如下: getRealName()方法就是获取这个人的真实名字,如果获取不到就以name返回…

堆的介绍,实现,使用(c语言实现)

目录 堆的概念 堆的性质: 堆的分类 父子结点的下标关系 堆的向下调整算法 ​编辑小堆 大堆 建堆 堆的向上调整算法 小堆 大堆 堆的基本操作 定义堆 初始化堆 销毁堆 打印堆 堆的插入 堆的删除 大堆(Max Heap)的向下调整算法…

Java 设计模式(上)

目录 一、单一职责原则 二、开闭原则 三、里氏替换原则 四、迪米特法则 五、接口隔离原则 六、依赖倒置原则 七、工厂方法 八、抽象工厂 九、建造者模式 十、原型模式 十一、单例模式 十二、适配器模式 一、单一职责原则 单一职责原则又称单一功能原则,…

回溯-单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相…

SpringMVC深解--一起学习吧之架构

SpringMVC的工作原理主要基于请求驱动,它采用了前端控制器模式来进行设计。以下是SpringMVC工作原理的详细解释: 请求接收与分发: 当用户发送一个请求到Web服务器时,这个请求首先会被SpringMVC的前端控制器(Dispatche…

关于远程桌面端口的优化措施的建议

在信息技术的世界中,远程桌面连接已成为企业、教育和个人用户之间共享信息、协作工作的重要工具。而这一切的背后,都离不开远程桌面端口(RDP,Remote Desktop Protocol Port)的支持。RDP端口不仅关乎到远程访问的顺畅性…

【Linux】进程信号 -- 详解

⚪前言 注意:进程间通信中的信号量跟下面要讲的信号没有任何关系。 一、从不同角度理解信号 1、生活角度的信号 你在网上买了很多件商品,在等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时,你该怎么处理快递&a…

CDA认证:数据行业领跑者,告别危机和低谷!

近日,人力资源社会保障部、中央组织部、中央网信办、国家发展改革委、教育部、科技部、工业和信息化部、财政部、国家数据局等九部门印发《加快数字人才培育支撑数字经济发展行动方案(2024—2026年)》(以下简称《行动方案》&#…

LeetCode39题: 组合总和(原创)

【题目描述】 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复…