整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。
6.1 整数集合的实现
typedef struct intset{
// 编码方式
uint32_t encoding;
// 集合包含的元素数量
uint32_t length;
// 保存元素的数组
int8_t contents[];
} intset;
contents 是整数集合的底层实现,每个元素都是contents数组的一个数组项,其中数字从小到大排列,且不包含重复项。虽然声明是int8_t,但是其真实类型是根据encoding属性的值决定的。
length 记录了整数集合包含的元素数量,也即contents数组的长度。
encoding 保存元素的类型,int16_t(INTSET_ENC_INT16)、int32_t、int64_t
6.2 升级
升级过程:
- 1、重新分配空间
- 2、根据原有元素顺序,从后往前放置旧元素到新位置
- 3、放置新元素
易得:插入元素时间复杂度为O(n)
能引发升级的,要么大于所有现有元素,要么小于所有现有元素(负数),所以,新元素位置要么是最后一个要么是第一个
6.3 升级的好处
- 提升灵活性
- 节约内存
6.4 降级
整数集合不支持降级,其实应该是跟PHP hashtable不提供降级逻辑一样
- 成本相对成果来说较高
- 降级需求并不大
6.5 整数集合API
6.6 重点回顾
以上
欢迎大家关注我的公众号