Redis系列之底层数据结构整数集IntSet

devtools/2025/1/20 21:23:59/

Redis系列之底层数据结构整数集IntSet

什么是IntSet

IntSet,整数集合,是Redis集合类型的一种底层数据结构,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,redis就会选用intset作为底层实现。

IntSet的数据结构

查看redis6.0源码,https://github.com/redis/redis/blob/6.0/src/intset.h,inset的数据结构如图:

typedef struct intset {uint32_t encoding;uint32_t length;int8_t contents[];
} intset;
  • encoding:表示编码方式,取值有:INTSET_ENC_INT16,INTSET_ENC_INT32,INTSET_ENC_INT64
  • length:代表存储的整数的个数
  • contents:实际存储数值的连续内存区域,本质是一个数组。各个项在数组中按值的大小从小到大有序排序,且数值中不包含重复项。总而言之,就是一个有序不重复的数组。

intset数据结构图:
在这里插入图片描述

set集合什么时候使用inset存储?

Redis中使用intset或者hashtable存储set。什么情况使用intset存储?

当集合对象可以同时满足以下两个条件时,使用intset:

  1. 集合对象保存的所有元素都是整数值,如果不是整数值使用dictht hash表(数组+链表)
  2. 集合对象保存的元素数量不超过512个,如果超过512个元素,使用hashtable

跟一个Redis配置有关系:

 set-max-intset-entries 512

intset数据结构和dictht hash对比,这个dictht hash就是Redis中另外一种重要的数据结构dict
在这里插入图片描述

拓展知识点

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

  • 根据新元素的类型,扩展整数集合底层数组的空间大小,并为新元素的分配空间。
  • 将底层数组现有的所有元素都转换成与新元素相同的类型,并将类型转换后的元素放置到正确的位上,放置过程需要维持有序性。
  • 最后改变encoding的值,length+1。
    ps:那么如果删除刚加入的int32类型时,会不会做一个降级操作呢?不会。主要还是减少开销的权衡。

http://www.ppmy.cn/devtools/152192.html

相关文章

Python脚本搬运当前文件夹及其子文件夹中所有的.c格式的文件到当前新建的文件夹中

写一个Python脚本,用来搬运当前文件夹及其子文件夹中所有的.c格式的文件到当前新建的SourceLib文件夹中,并排除搬运isnocopyname.txt中定义的c文件。新建Lib_Log.txt文本,开头打印当前计算器名和时间,并将搬运的文件的路径及文件名…

PostCSS安装与基本使用?

1. 安装PostCSS及其CLI工具 在全局环境中安装PostCSS CLI工具以便从命令行运行PostCSS: npm install -g postcss postcss-cli如果你想在项目中局部安装: npm install --save-dev postcss postcss-cli2. 创建PostCSS配置文件 在项目根目录下创建一个名…

lvm快照备份

前提 数据文件要在逻辑卷上; 此逻辑卷所在卷组必须有足够空间使用快照卷; 数据文件和事务日志要在同一个逻辑卷上; 前提:MySQL数据lv和将要创建的快照要在同一vg,vg要有足够的空间存储 优点 几乎是热备&…

Nature Microbiology | John C. Alverdy组-肠杆菌素抑制芳香烃受体促进小鼠细菌性败血症...

研究论文 ● 期刊:Nature Microbiology (IF:20.5) ● DOI:https://doi.org/10.1038/s41564-024-01882-9 ●原文链接: https://www.nature.com/articles/s41564-024-01882-9 ● 第一作者:Robert C. Keskey ● 通讯作者:Robert C. …

深入探索Go语言中的临时对象池:sync.Pool

深入探索Go语言中的临时对象池:sync.Pool 在当前的编程世界中,Go语言以其简洁的语法、高效的并发支持以及强大的标准库而受到开发者们的青睐。对于那些追求极致性能的程序员来说,Go语言的sync.Pool提供了一个理想的工具集来加速开发过程并优化程序性能。本文旨在全面深入地…

我的世界-与门、或门、非门等基本门电路实现

一、红石比较器 (1) 红石比较器结构 红石比较器有前端单火把、后端双火把以及两个侧端 其中后端和侧端是输入信号,前端是输出信号 (2) 红石比较器的两种模式 比较模式 前端火把未点亮时处于比较模式 侧端>后端 → 0 当任一侧端强度大于后端强度时,输出…

WebSocket有哪些缺点?应该如何解决?

虽然 WebSocket 提供了许多优势,使其成为实时通信的理想选择,但它也有一些缺点和局限性。以下是 WebSocket 的一些主要缺点: 1. 初始握手开销 HTTP 握手:WebSocket 连接需要先通过 HTTP 协议进行握手,这增加了初始连接…

麒麟操作系统服务架构保姆级教程(十)rewrite跳转

如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情 我们访问一个网页的时候会遇到一些奇形怪状的url地址,想优化一下,看着顺眼一点,或者打开一个短视频软件想摸鱼刷一会视频,在打开界面的时候无意间按到…