版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33330687/article/details/86527722
1. 作用
整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多,Redis会使用整数集合作为集合的底层实现
2. 数据结构
typedef struct intset{
//编码方式
uint32_t encoding;
//集合包含的元素数量
uint32_t length;
//保存元素的数组
int8_t contents[];
}
整数集合可以保存的值有int16,int32,int64
如果编码方式为INTSET_ENC_INT16,contents数组为16*5=80位/8 = 10
3. 升级
每当要把一个新元素加入集合,并且新元素类型比整数集合现有所有元素的类型都要长,整数集合需要先进行升级,然后才能将新元素添加到整数集合里面
升级分为三步
- 根据新元素扩展整数集合底层数组空间大小,并为新元素分配空间
- 将底层数组现有的所有元素都转换成新元素相同的类型,并将类型转换后的元素放置到正确的位上,放置过程中需要保持原有的次序不变
- 将新元素添加进底层数组中
所以插入一个元素的时间复杂度是O(N)
4. 升级的好处
- 提示灵活性
- c语音是静态类型,数组只能保存同一类型的元素,升级便于操作,不用担心类型错误
- 节约内存
- 如果想一个数组同时保持16,32,64位整数,底层数组需要是64位的,这样将会增大内存消耗,只有在集合中添加了64位整数才会升级至64位底层数组,再次之前都是可以节约内存的