Redis中的整数集合

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)

猜你喜欢

转载自www.cnblogs.com/hhe0/p/9254355.html