当一个集合中数量不多且只包含整数元素,redis则用整数集合来作为集合的底层实现。
typedef struct intset{ //编码方式 uint32_t encoding; //集合包含的元素数量 uint32_t length; //保存元素的数组 int8_t contents[]; }intset;
contents数组各个项按值从小到大排序。
length记录了数组的大小,其中数组的真正类型取决于encoding的值。
升级:当出现一个新元素类型比其他整数集合都要长时,进行升级操作,并且加到第一个或最后一个(因为是有序的)。
分三步:
1.根据新元素类型,扩展整个数组的空间大小并为新元素分配空间。
2.将当前数组中元素转换成与新元素相同的类型,并放到正确的位上。
3.将新元素添加到底层数组里面。
时间复杂度为O(n)
好处:提升整数集合的灵活性,尽可能节约内存。
没有降级的操作。