原创

Redis基本数据结构-intSet


IntSet原理

微信截图_20230204000658

inset是在C语言本身数组的基础上做了进一步的封装

微信截图_20230204143612

这里每个元素的都占用了两个字节(及时数据本身不需要两个字节,比如5),数组内存是连续的且元素的字节数也是固定的,所以就可以根据起始内存地址推算出其他元素的内存地址,在这里声明位数是为了基于数组角标(下标)去快速定位对应的元素。

在遇到超过容量范围(超过了当前intset的编码)的数据时intSet会进行一个扩容操作。为了确保每一个元素编码风格统一方便将来寻址,在扩容时所有元素都会一起调整如下图。

扩容前:

微信截图_20230204145257

扩容后:

微信截图_20230204145532

源码

查看intSet的add方法里面会调用扩容方法intsetUpgradeAndAdd

微信截图_20230204155415

查看intsetUpgradeAndAdd代码

微信截图_20230204163435

为了确保set集合有序,插入时会在当前intset中用二分查找与value一样的元素角标pos

微信截图_20230204164255

最后总结:

Intset可以看做是特殊的整数数组,具备一些特点:

  • Redis会确保Intset中的元素唯一、有序
  • 具备类型升级机制,可以节省内存空间
  • 底层采用二分查找方式来查询
Linux
redis原理
  • 作者:陌攻(联系作者)
  • 发表时间:2023-02-08 02:57
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论