redis数据结构实现--整数集合(intset)
整数集合是集合键的底层实现之一,当一个集合键只包含整数元素,且元素不多时,Redis会采用整数集合作为集合键的底层实现。
可以保存int16_t,int32_t, int64_t类型的整数值。集合中不会出现重复元素
5.1 整数集合的实现
inset结构:
typedef struct inset{
//编码方式
uint32_t encoding;
//集合包含的元素数量
uint32_t length;
//保存元素的数组
int8_t contents[];
}intset;
contents数组就是整数数组的底层实现,各个元素在数组中按数组大小排序,且不可重复
虽然contents数组类型是int8_t,但是数组不存储任何int8_t类型的元素,contents数组真正的类型取决于encoding的值
5.2 升级(upgrade)
当我们添加一个新元素到整数集合中,并且新元素的类型比整数集合中的所有元素类型都要长,那么整数集合需要先进行升级,才能添加此新元素。
添加新元素并升级步骤:
1. 根据新元素类型,拓展整数集合底层数组空间大小,并为新元素分配空间
2. 将底层数组已有元素全部转化成新元素相同类型,并放置到正确的位上,此过程要保持有序性不变
3. 添加新元素
4. 修改encoding
引发升级的新元素长度肯定大于数组内已存的所有元素,所以这个新元素的值要么大于所有现有元素,要么小于所有现有元素。
大于所有元素则插入在数组尾,小于所有元素则插入在数组头
升级的好处
- 升级带来更好的灵活性:整数集合自适应各种不同类型;
- 升级能够节省内存:确保扩展内存只在有需要的时候进行
5.3 降级
整数集合不支持降级操作,一旦数组类型升级,编码一直保持升级后的状态。