1. 用途
该数据结构主要用于集合(set)中.当元素为int且数量不多的时候,集合使用该数据结构实现.而且本身是有序的,不包含重复值。
新增的时候应该是插入排序。
2. 数据结构
typedef stuct intset {
uint32_t length;//元素个数
uint32_t encoding ;//编码方式,底层存储的整数类型
int8_t []contents;//保存原始的byte数组,实际是根据encoding来决定几个数组组成一个真正的整数
}
length:已保存的原始类型encoding:intset_enc_int16:底层contents存放的16位int.两个字节表示一个元素intset_enc_int32:32位intintset_enc_int64:64位int
3. 编码升级
当一个一直存放int32_t的intset存入一个int64_t的时候,为了保证数据对齐和能按照下标查找的特性,所有已存入的元素会从原来占据4个字节变成占据8个字节.
encoding值会变成intset_enc_int64- 同时
length加一
例如原来0-31位保存第一个元素,32-63保存第二个元素,当加入一个int64_t的时候,底层contents会扩容到64*3=192个字节.同时第0元素占据的位置会从0-31变成0-63,第二位类似.
redis中大量使用这种编码和升降级。
4.不支持降级
5. 优点
- 灵活
- 节省内存空间