当集合中只有整数,且数目不多时,redis会使用整数集合intset作为集合的实现。
整数集合可保存16位 32位以及64位整数,且去重。
typedef struct intset {
//编码方式
uint32_t encoding;
//元素数目
uint32_t length;
//保存元素的数组
int8_t contents[];
} intset;
contents中各个元素从小到大有序排列,并且不包含重复项
contents 数组中真正的类型取决于 encoding属性的值
当整数集合中添加一个新元素且 新元素类型在encoding编码下已经存放不下 需要进行升级:
1 重新分配空间
2 迁移
3 添加新元素
需要对每个元素进行类型转换 时间复杂度O(N)
好处:
1 提升灵活性 不用考虑整数集合类型 直接添加即可,服务端进行类型转换,避免类型不符合错误
2 尽可能节约内存空间,只有在有需要的时候才进行升级。
降级:
整数集合只支持升级操作,不支持降级。