整数集合是集合键的底层实现之一。当一个集合只包含整数值元素,并且这个集合的元素不多时,Redis会用整数集合作为集合键的底层实现。
1.整数集合的数据结构
-
typedef struct intset { uint32_t encoding; // 编码方式 uint32_t length; // 集合包含的元素数量 int8_t contents[]; // 保存元素的数组 } intset;
contents数组的真正类型取决于encoding属性的值。当encoding属性的值为INTSET_ENC_INT16_t,则contents是一个int16_t类型的数组;当encoding属性的值为INTSET_ENC_INT32_t,则contents是一个int32_t类型的数组;当encoding属性的值为INTSET_ENC_INT64_t,则contents是一个int64_t类型的数组。
2.升级
当要将一个新的元素添加到整数集合里,并且新元素的类型比集合里所有元素类型都要长时,整数集合需要先进行升级,才能将新元素添加至集合。具体步骤如下:
- 根据新元素的类型,扩展整数集合底层数组的空间大小,并为新元素分配空间。
- 将底层数组现有元素都转换为与新元素相同的类型,并将类型转换后的元素放到正确的位置上,在转移元素过程中,需要维持底层数组的有序性质不变。
- 将新元素添加至底层数组里。
因为引发升级操作的元素长度总是比集合里所有元素长度都要大,所以新元素的值要么大于所有元素,此时新元素放在底层数组最末尾;要么小于所有元素,此时新元素放在底层数组最开头。
3.降级
整数集合不支持降级操作,一旦对数组进行了升级,编码就会保持升级后的状态。