Redis设计与实现_6.整数集合

整数集合的实现

当一个集合只包含整数值元素,并且数量不多时,redis就会采用整数集合作为集合键的底层实现

typedef strcut intset
{
	uint32_t encoding; //编码方式
	uint32_t length; //元素数量
	int8_t contents[]; //保存元素的数组
}

可以保存类型为 int16_t,int32_t,int64_t的非重复整数值,且元素在contents数组中有序排列

升级

每当添加一个新元素到整数集合里面,并且新元素的类型比现有所有元素类型都长,需要先对整数集合进行升级,再加入该元素

  1. 根据新元素类型,扩展整数集合底层数组的空间大小,并为新元素分配空间
  2. 将底层数组现有的所有元素转换成与新元素相同的类型,并且放置到正确位置上,仍需保证有序性
  3. 将新元素添加到底层数组里

每次添加新元素都有可能引起升级,而每次升级都需要对底层数组所有元素进行类型转换,所以添加新元素时间复杂度为O(N)

新元素要么小于现有所有元素,则放在底层数组的索引0的位置;要么大于所有元素,放在底层数组索引 length-1的位置

升级的好处

提升灵活性

整数集合可以通过自动升级底层数组来适应新元素,所以可以将 int16_t,int32_t,int64_t随意地添加到集合中,不必担心类型错误

节约内存

既可以让集合能同时保存三种不同类型的值,又可以确保升级只在必要时进行

降级

时保存三种不同类型的值,又可以确保升级只在必要时进行

降级

不支持降级操作,即使把之前因为他而升级的元素删除,底层数组还仍然是加入那个元素后的类型

猜你喜欢

转载自blog.csdn.net/weixin_42249196/article/details/108272278