=================
== Time Stream ==
=================
一个小学生

Redis整数集合

redis

当一个集合只包含整数值元素,并且集合的元素数不多时,Redis使用整数集合intset作为集合键的底层实现。

Intset实现:

intset {
  // 编码方式
  uint32_t encoding;
  
  // 集合包含的元素数量
  uint32_t length;
  
  // 保存元素的数组
  int8_t contents[];
}
  1. encoding,决定contents数组的真正类型,取值:int16_t, int32_t, int64_t
  2. length,记录整数集合包含的元素数量,也就是contents数组长度
  3. contents,数组,每项都按从小到大有序排列,不包含重复项

升级

当要添加到集合中的新元素类型比现有元素类型长,需要对集合进行升级upgrade,才能将新元素添加到集合中:

  1. 根据新元素类型,扩展底层数组空间大小,为新元素分配空间。
  2. 将现有元素转化成和新元素相同类型,并放到正确位置上,保持有序不变
  3. 将新元素添加到数组里

升级的好处

  1. 提升整数集合的灵活性,可以将不同类型的整数添加到集合中,不需担心出现类型错误。
  2. 尽可能节约内存,可以确保升级操作只在有需要的时候才进行。

降级

整数集合不支持降级操作,一旦对数组进行了升级,编码就会一直保持升级后的状态。

参考

  • 《redis设计与实现》(第二版)