整数集合的实现
当一个集合只包含整数值元素,并且数量不多时,redis就会采用整数集合作为集合键的底层实现
typedef strcut intset
{
uint32_t encoding; //编码方式
uint32_t length; //元素数量
int8_t contents[]; //保存元素的数组
}
可以保存类型为 int16_t,int32_t,int64_t的非重复整数值,且元素在contents数组中有序排列
升级
每当添加一个新元素到整数集合里面,并且新元素的类型比现有所有元素类型都长,需要先对整数集合进行升级,再加入该元素
- 根据新元素类型,扩展整数集合底层数组的空间大小,并为新元素分配空间
- 将底层数组现有的所有元素转换成与新元素相同的类型,并且放置到正确位置上,仍需保证有序性
- 将新元素添加到底层数组里
每次添加新元素都有可能引起升级,而每次升级都需要对底层数组所有元素进行类型转换,所以添加新元素时间复杂度为O(N)
新元素要么小于现有所有元素,则放在底层数组的索引0的位置;要么大于所有元素,放在底层数组索引 length-1的位置
升级的好处
提升灵活性
整数集合可以通过自动升级底层数组来适应新元素,所以可以将 int16_t,int32_t,int64_t随意地添加到集合中,不必担心类型错误
节约内存
既可以让集合能同时保存三种不同类型的值,又可以确保升级只在必要时进行
降级
时保存三种不同类型的值,又可以确保升级只在必要时进行
降级
不支持降级操作,即使把之前因为他而升级的元素删除,底层数组还仍然是加入那个元素后的类型