数据结构
整数集合是redis为了保存整数值的集合而抽象出来的数据结构。
intset数据结构
typedef struct intset {
// 编码方式
uint32_t encoding;
// 集合包含的元素个数
uint32_t length;
// 保存元素的数组
int8_t contents[];
看这意思,也是把数组封装了一层,把length拿出来维护,方便返回数组个数。
另外两个属性就是intset的精髓了。
contents[]中的int类型,并不是int8的。而是根据encoding中定义的编码方式动态变化的。这里叫升级。
什么意思呢?
假如,刚开始定义的时候,数组中存的1,2,3。这时候元素的个数是3,编码方式是int16。现在要插入65535(int32类型),之前数组的格就大小就不够用了嘛,那就扩容呗,把之前的每个元素所占的格都扩容成int32。这样整个数组就变大了。
升级的好处是什么
-
灵活
通常不会将不同类型的数据放在一个数组里面。这样设计就可以放在一个数组里面了 -
节约内存
需要时升级,不需要时就那么大。有点类似压缩列表,但,压缩列表遍历的时候需要通过offset一个一个的遍历,数组因为每个格大小是一样的,所以支持下标快速寻址。
注意:只能扩容,不能缩容。
网友评论