Redis底层数据结构之IntSet

目录

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

上一篇 redis底层数据结构之Dict
下一篇 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.hqwc.cn/news/645286.html

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

相关文章

StarRocks最佳实践经验

目录 一、部署 1.1 容量规划 1.2 基础环境配置 1.3 机器配置 1.3.1 FE节点 1.3.2 BE节点 1.4 部署方案 二、建模 2.1 建表规范 2.2 模型选择 2.3 排序列和前缀索引选择 2.4 分区选择 2.5 分桶选择 2.6 字段类型 2.7 索引选择 2.7.1 Bitmap索引 2.7.2 Bloom fi…

Element-plus DatePicker 日期选择器【正则校验时间范围】

效果图&#xff1a; 利用element-plus中的form表单验证完成效果。 <el-form-item label"检查计划截止日期&#xff1a;" prop"deadline"><el-date-pickerv-model"form.deadline"value-format"YYYY-MM-DD"style"width: …

【复现】金和OA-jc6 RCE漏洞_74

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 金和C6协同管理平台包括协同办公管理,人力资源管理,项目管理,客户关系管理,企业目标管理,费用管理,移动办公,微信办公等多个业务范…

2024年【北京市安全员-B证】模拟考试题库及北京市安全员-B证操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 北京市安全员-B证模拟考试题库是安全生产模拟考试一点通总题库中生成的一套北京市安全员-B证操作证考试&#xff0c;安全生产模拟考试一点通上北京市安全员-B证作业手机同步练习。2024年【北京市安全员-B证】模拟考试…

ZeRO论文阅读

一.前情提要 1.本文理论为主&#xff0c;并且仅为个人理解&#xff0c;能力一般&#xff0c;不喜勿喷 2.本文理论知识较为成体系 3.如有需要&#xff0c;以下是原文&#xff0c;更为完备 Zero 论文精读【论文精读】_哔哩哔哩_bilibili 二.正文 1.前言 ①为什么用该技术&…

docker网络和模式

Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为container-IP&#xff0c;同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个…

【软件测试】采用等价类划分法设计测试用例

例题1 请采用等价类划分法设计测试用例。 考虑软件 app, 它有两个输入变量 , 分别是 name 和 age, 其中 ,name 是至多包含 20 个字母字符的非空字符串 ,age 是整数型变量 ,0 ≤ age ≤ 120 。当输入给 name 的字符串的长度超过 20时 ,name 取前 20 个字符作为 name 的值 ; 如果…

Flink窗口机制

1.窗口的概念 窗口概念 时间是为窗口服务的。窗口是什么&#xff1f;为什么会有窗口呢&#xff1f; &#xff08;1&#xff09;Flink要处理的数据&#xff0c;一般是从Kafka过来的流式数据&#xff0c;如果只是单纯地统计流的数据量&#xff0c;是没办法统计的。 &#xff08;…

【目标检测论文解读复现NO.35】采用改进的 EfficientNet 识别苹果叶片病害

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

MATLAB基于图像特征的火灾检测

实验目标 基于图像特征的火灾检测 实验环境 Windows电脑、MATLAB R2020a 实验内容 1.读取图像&#xff0c;彩色图像的灰度化处理&#xff0c;进行边缘检测&#xff0c;实现对火焰的检测。 2.对两幅RGB图像进行火焰特征提取实验 3.对比分析边缘检测算法处理结果和基于图像…

电脑屏幕监控软件大集结:五款不可不知的神器!

嗨&#xff0c;各位科技达人&#xff01; 在这个数字时代&#xff0c;电脑已经成为我们生活中不可或缺的伙伴。 但随着我们的数字生活愈发紧密&#xff0c;网络安全和个人隐私保护也越来越重要。所以&#xff0c;当我们需要监控电脑屏幕活动时&#xff0c;就需要一些强大的助…

【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序(万字博文)

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序&#xff08;万字博文&#xff09; 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制&#xff08;CRC算法、MD5算法&#xff09; 文章目…