Redis底层数据结构-IntSet

IntSet是Redis中set集合的一种实现方式,基于整数数组来实现,并具备长度可变,有序等特征。

结构如下图所示:

int8_t contents\[\]的元素只有一个字节,能表示的整数范围只有-128~127,是不是有点小呀?

其实数组本身只是一个指针,指向起始元素的地址,intset并不依赖于C语言提供的数组相关函数,所有增删改查都是自己来做的

由此,对这个数组的操作和大小并不是像表面看到的一样,而是由encoding来决定 的

为了方便查找,Redis会将intset中所有的整数按照升序依次保存在contents数组中,结构如下图:

如果在该案例中插入一个大于int16最大值的数据50000后,应该会发生什么?

  1. 会升级编码为符合条件的最小编码,在本例子中升级编码为INTSET_ENC_INT32,每个整数占4字节,并按照新的编码方式以及元素个数扩容数组.

  2. 倒序依次(先调整20,10,5)将数组中的元素拷贝到扩容后的正确位置。

  3. 调整之后的位置:

  4. 将待添加的元素放入数组末尾

  5. 最后,将intset的encoding属性改为INTSET_ENC_INT32,将length修改为4

IntSet可以看作是特殊的整数数组,具备一些特点:

  1. Redis会确保IntSet中的元素唯一有序
  2. 具备类型升级机制,可以节省内存空间
  3. 底层采用二分查找来查询
相关推荐
青瓦梦滋17 分钟前
Redis主从复制
服务器·数据库·redis·缓存·bootstrap
慧都小妮子1 小时前
Wyn商业智能国产数据库适配:数据接入、分析缓存与审计日志验证清单
数据库·数据分析·数据可视化·审计日志·商业智能
阿卡好可爱1 小时前
Lua 热更新不生效:改完文件线上仍是旧逻辑,package.loaded 与 upvalue 重绑定详解
数据结构·分布式·后端·架构·lua
Joy T2 小时前
Redis Lua 原子限流:Lua 脚本、竞态条件与并发控制
数据库·redis·lua·限流·竞态条件·redis scripting
杨凯凡2 小时前
MySQL 死锁怎么排查?InnoDB 锁等待与 Spring Boot 整事务重试实战
数据库·spring boot·mysql
Aloudata2 小时前
Claude 做数据分析的这两年:一份复盘与发展线索
大数据·数据库·人工智能·数据挖掘·数据分析·dataagent
Decay__2 小时前
01_SQLServer 体系架构全解 —— 实例进程、关系引擎、SQLOS 与事务日志深入
运维·数据库·sql·mysql·架构
zhanghaha13143 小时前
C# 系列教程_12 字符串 string 保姆级系统教程(面向新手,大量示例 + 原理讲解)
开发语言·数据库·c#
韩曙亮3 小时前
【错误记录】安卓 adb 调试 5037 端口占用排查 ( adb 的三层结构 | 找出本机占用 5037 的进程 )
android·数据库·adb·安卓·错误记录
瑞雪兆丰年兮3 小时前
JavaWeb-day07-MySQL(DQL&多表设计)
java·开发语言·数据库·sql·mysql·javaweb·web