Redis中的整数集合
- 整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现
整数集合的实现
typedefe struct intset {
// 编码方式
uint32_t encoding;
// 集合包含的元素数量
uint32_t length;
// 保存元素的数组
int8_t contents[];
} intset;
- 整数集合的每个元素都是contents数组的一个数组项(item),各个项在数组中是按照从小到大的顺序有序排列的,并且在数组中不包含任何重复项
整数集合的升级
步骤
- 根据新元素的类型,扩展整数集合底层数组的空间大小,并为新元素分配空间
- 将底层数组现有的所有元素都转换为与新元素相同的类型,并将类型转换后的元素放置到正确的位置上,而且在放置元素的过程中,需要继续维持底层数组的有序性质不变
- 将新元素添加到底层数组中
好处
- 提升灵活性。可以将各种整数类型的数据放入一个数组中
- 节约内存。只在需要扩充内存空间的情况下进行升级
整数集合的降级
- 整数集合不存在降级操作。即使删除导致降级的元素,集合依然不会降低自己的整数类型
整数集合API
insetNew |
创建一个新的压缩列表 |
O(1) |
intsetAdd |
将给定元素添加到整数集合里面 |
O(N) |
intsetRemove |
从整数集合中移除给定元素 |
O(N) |
intsetFind |
检查给定值是否存在于集合 |
因为底层数组有序,查找可以通过二分查找法来进行,所以复杂度为O(logN) |
intsetRandom |
从整数集合中随机返回一个元素 |
O(1) |
intsetGet |
取出底层数组在给定索引上的元素 |
O(1) |
intsetLen |
返回整数集合包含的元素个数 |
O(1) |
intsetBlobLen |
返回整数集合占用的内存字节数 |
O(1) |