《Redis设计与实现》第六章总结:整数集合

5.整数集合(intset)

集合键的底层实现之一:当一个集合只包含整数值元素,且数量不多时,如5个

5.1 整数集合的实现

用于保存整数值的集合抽象数据结构,且保证集合中不会出现重复元素,类型可以为int16_t、int32_t、itn64_t,且按照从小到大排序

intset.h/intset:
在这里插入图片描述
可以看到,其底层实现为数组

而contents数组实际上保存的值不是int8_t,而是取决于encoding属性的值:
在这里插入图片描述
例子:包含五个int16_t类型整数值的整数集合,其contents数组大小等于sizeof(int16_t)*5=16 * 5 = 80位
在这里插入图片描述
注意:如果数组中存储了一个需要用int64_t类型来保存的数,那么其他数,就算可以不用int64_t存储,也会升级为int64_t,即5.2中所要说的升级

5.2 升级

每当要添加的新元素的类型比现类型长时,需要先进行升级,然后再添加

5.2.1 步骤如下:

a.根据新元素类型,扩展整数集合底层数组的空间大小,并为新元素分配空间
b.将底层数组现有的元素都转化成与新元素相同的类型,并将类型转化后的元素放置到正确的位上;且在放置元素的过程中,需要继续维持底层数组的有序性质不变
c.添加新元素

例子:
1.原数组
在这里插入图片描述
2.要添加int32_t类型的65535,则需要的总空间为4 * 32 = 128,即执行第a步
在这里插入图片描述
3.执行第b步,元素3移到索引2上,即64-95,依次类推;然后执行第c步,最后修改encoding属性为INTSET_ENC_INT32,length+1,完成添加元素操作
在这里插入图片描述
注意:能引发升级的新元素的位置如下;比所有元素都小的情况是最小的负数,如32位的-65536
在这里插入图片描述

5.2.2 升级的好处

有两个好处,如下

5.2.2.1 提升灵活性

在这里插入图片描述

5.2.2.2 节约内存

在这里插入图片描述

5.3 降级

不支持降级操作,I’m sorry,即使把当前编码唯一一个元素删除了,也会保持当前编码,不会降下来
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41594698/article/details/94326329