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

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

什么是IntSet

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

IntSet的数据结构

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

cpp 复制代码
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类型时,会不会做一个降级操作呢?不会。主要还是减少开销的权衡。
相关推荐
运维行者_1 小时前
企业无线网络监控的挑战与智能化演进趋势
大数据·运维·服务器·网络·数据库
国强_dev2 小时前
技术探讨:使用 stunnel 加密转发数据库连接时,如何获取客户端真实 IP?
数据库·网络协议·tcp/ip
@insist1232 小时前
系统规划与管理师-信息系统规划核心工作要点解析
数据库·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
超级数据查看器2 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
数安3000天2 小时前
增量数据如何自动分类分级,避免目录“过期“?
大数据·数据库
南墙上的石头3 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql
画中有画4 小时前
论向量数据库在项目中的应用
数据库
spider_xcxc5 小时前
Redis 数据库高质量实践指南(一)
运维·数据库·redis·oracle·云计算
l1t5 小时前
在linux和windows中解决duckdb 1.6dev版本输出执行计划报错问题
linux·运维·数据库·windows·duckdb
执子手 吹散苍茫茫烟波6 小时前
RC 隔离级别下 MySQL InnoDB 死锁典型案例
数据库·mysql