redis自学(2)IntSet

IntSet

IntSetredisset集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特征。

 

 

可能会有疑惑,int8_t 的数组contents只有1个字节,怎么可能存的下数组,其实这里的contents存储的只是指向真正数组的指针。

IntSet的取值范围大小,实际上是由encoding属性决定的

 

 

length则是存储元素的个数。

 IntSet为了方便查找,会将数组中的元素按照升序存储

 

有个明显的疑问,元素5”明显用不了int16的两个字节,冗余了,但是为什么还要这样呢,这是为了方便确定元素的脚标,能够更快的根据脚标查找元素,达到快速寻址。因为IntSet的内存地址是连续的,如果找脚标为1 的数据,那么拿脚标为0的地址+2个字节就是1的地址了

 

IntSet升级(占用内存空间一开始从小到大,节省内存空间)

  1. IntSet会自动升级编码方式到合适的大小。升级会根据新元素的大小判断合适的编码方式,升级的同时,原先的元素编码的方式一起升级扩容。重新申请内存,然后倒序依次将数组中的元素拷贝到扩容后正确的位置,正序会存在数据覆盖的情况,比如原先第一个元素两个字节,新的编码方式是4个字节,正序存储,第一个元素会直接把第二个元素给覆盖了,倒序是从后面开始,不会出现覆盖数据的情况,同时角标不会改变。
  2. 将待添加的元素放入数组队尾,也可能是队首,因为新元素有可能是负值,放在哪里在升级前就已经有判断了。
  3. 最后修改insertencoding信息和length信息为最新的编码方式。

 

IntSet保证正序的方式是插入的时候,进行二分查找。

IntSet不适合数据量多的情况下使用,因为申请特别大的连续内存空间可能不方便。

posted @ 2024-02-21 13:59  蓝海的bug本  阅读(41)  评论(0编辑  收藏  举报