Redis源码分析-intset.h/c

intset.h/c 是Redis 的整数set实现,intset的结构体如下:

基本结构

typedef struct intset {

    uint32_t encoding;
    uint32_t length;
    int8_t contents[];

} intset;

intset的第一个成员encoding,表明contents中的存储数据的数据长度,可以是16bits, 32bits, 64bits。第二个成员length表示intset中的元素个数。


一些关键实现

  1. 由于intset属于底层存储,所以在读取数据时,要考虑big endian 和little endian的问题。memrev64ifbe和intrev32ifbe函数,可以将big endian的数能够转换成littleendian值。
  2. intset使用数组(contents)来存储数据,数据按照由小到大的顺序存储,体现在intsetSearch这个函数的二分查找方法中。
  3. 当插入新元素时,首先判断encoding是否小于当前值,否则调用intsetUpgradeAndAdd函数,将原来intset中的数据都变成新的encoding,同时把新元素插入到set。
  4. 在执行intsetAdd和intsetRemove函数增删元素的时候,都要调用intsetResize增加或者减少空间,同时按照顺序插入或者删除元素。在移动元素时,使用intsetMoveTail,内部通过memmove实现。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值