整数集合(intset)
定义
-
用于保存整数值的集合抽象数据结构
- 可保存类型为 int16_t、int32_t 或 int64_t 的整数值
- 保证集合中不会出现重复元素
-
集合键的底层实现之一
1 | typedef struct intset |
注:contents 数组是整数集合的底层实现,每个数组元素作为一个数组项(item),各个项在数组中按值的大小从小到大有序地排列,并且数组中不包含任何重复项。
适用场景
-
集合只包含整数值元素,并且该集合的元素数量不多
升级(upgrade)
产生原因
-
添加新元素到数组中时,由于新元素的类型比整数集合现有所有元素的类型都要长时,整数集合需要先进行升级
目的
-
提升整数集合的灵活性:因为整数集合可以通过自动升级底层数组来适应新元素,所以我们可以随意地将 int16_t、int32_t 或者 int64_t 类型的整数添加到集合中,而不必担心出现类型错误
-
尽可能地节约内存
步骤
-
根据新元素的类型,扩展整数集合底层数组的空间大小,并为新元素分配空间
-
将底层数组现有的所有元素都转换成与新元素相同的类型,并将类型转换后的元素放置到正确的位上,而且在放置元素的过程中,需要继续维持底层数组的有序性质不变。
-
将新元素添加到底层数组中,再更新原整数集合的 encoding 和 length
时间复杂度
-
O (N):每次升级都需要对底层数组中已有的所有元素进行类型转换
降级(degrade)
-
整数集合不支持该操作。这也意味着一旦整数集合经过升级并占用更大的内存后,即便经过后续操作后不再需要过大的内存空间时,也无法进行回退
集合操作
常用命令
1 | import redis |
差集、交集与并集运算
1 | # SDIFF:对两个集合作差集运算 |
注:就集合这一结构而言,其基本功能在 Python 与 Redis 中的实现并无过大差别。Redis 集合的好处在于,可以同时被多个客户端进行远程访问。
【参考】
[1] 《Redis 的设计与实现》
[2] 《Redis 实战》