《Redis - 底层数据结构 - 整数集合(intset)》
一:概述
- Redis 源码版本为3.0.0.
- 整数集合(intset) 是集合键的底层实现之一。当一个集合元素不多,并只有整数时,会使用整数集合来实现。
二:整数集合的基础结构
- 概述
- 用于保存整数值集合,可以保存类型为 ini16_t、ini32_t、ini64_t 整数,并保证集合不会出现重复元素。
- 基本结构(src/intset.h)
-
- content数组 是整数集合的底层实现,各个数组中按值大小有序排列,并且没有任何重复项。
- length记录了数组的长度。
- 集合的类型取决于 encoding 属性的值。而不是 contents 的类型。
三:升级
- 概述
- 当有新元素添加到整数集合,而新元素的类型比整数集合的类型还要大时,此时整数集合便需要升级。
- 原理
- 扩展底层数组的空间大小,并为新元素分配空间。
- 将数组现有元素转换与新元素相同的类型。并放在正确的位置上。
- 将新元素添加值底层数组。
- 源码实现
-
- 实例
- 假设原数组 存在 int16_t 类型的 数据 1,2,3,共占用 3 * 16 = 48位空间
-
- 当新添加的元素为 65535,则就需要升级为 int32_t 类型。
- 需要扩展底层数组空间为 4 * 32 = 128 位。
-
- 这时需要对数组现有元素进行类型转换(这里要从后往前的处理原数据,因为如果从前往后处理的话,扩展的字节数会覆盖之前的数据)。
- 首先处理原数据 3,按照位置转换类型至对应位置。
-
- 其余元素同理,最后处理新元素,完成升级
- 优势
- 节省内存。
- 提升整数集合的灵活性 (保持数组内类型的一致性)
四:降级
- 不支持降级操作,一旦对数组升级,便会一致保持升级后状态。