Redis数据结构--整数集合intset
IntSet是redis集合的一种实现方式,基于整数数组来实现,并且具备长度可变,有序等特征;
整数集合的实现
typedef struct intset{ //编码方式 uint32_t encoding; //集合包含元素的数量 uint32_t length; //保存元素的数组 int8_t contents[]; }insert;
contents数组是整数集合的底层实现:整数集合的每个元素都是contents数组的一个数组项,各国项在数组中按值的大小从小到大的有序排列,并且数组中不包含任何重复项。
length属性记录了整数集合包含的元素数量,也即是contents数组的长度
实际上的contents数组并不保存任何int8_t类型的值,contents数组的真正类型取决于encoding属性的值。
升级
每当要将一个新元素添加到整数集合里面,并且新元素的类型比整数集合现有的所有类型元素的类型都要长时,整数集合需要先进行升级,然后才能将新元素添加到集合里面。
升级整数集合并添加新元素的三大步骤:
1.根据元素的类型,扩展整数集合底层数组的空间大小,并为新元素分配空间;
2.将底层数组现有的所有元素转换成与新元素相同的类型,并将转换后的元素放到正确的位置上,而且放置元素的过程中,需要维持底层数组的有序性不变;
3.将新元素添加到底层数组里面;
因为每次向整数集合添加新元素都可能引起升级,而每次升级都需要对底层数组中所有的元素进行类型转换,所以向整数集合添加新元素的时间复杂度为O(N)。
降级
整数集合不支持降级操作,一旦对数组进行了升级,编码就会一直保持升级后的状态。