Redis源码学习-4-整数集合

整数集合


主要存放在 intset.h

1. 数据结构

typedef struct intset {
    
    // 编码方式
    uint32_t encoding;

    // 集合包含的元素数量
    uint32_t length;

    // 保存元素的数组
    int8_t contents[];

} intset;

Redis的intset的元素类型,主要取决于encoding字段,分别保存16, 32, 64位的整数。所以contents前面的类型没有任何意义。

2. 有序结构

intset是一种有序结构,即contents是按照从小到大进行排列的。

因此查找的时候就可以使用二分查找。是O(logN)的时间复杂度。

3. 升级

  1. intset默认保存的是16位大小的数据。
// 设置初始编码
is->encoding = intrev32ifbe(INTSET_ENC_INT16);
  1. 当新添加的元素比16位编码大或者小时,就会发生升级。升级效果如下,比如新插入的数字是32位大小的。那么所有contents数组中的内容就会被更新为32位大小。

3.1 具体演示

在这里插入图片描述

现在插入65535,因为这个数字大于MAX_INT16,所以需要realloc重新分配内存。因为是大于,所以保留最后的位置。如果是小于,即插入-65535,则是保留最前面的位置。

在这里插入图片描述

重新调整index 2位置的元素

*((int32_t*)contents + 2) = *((int16_t*)contents + 2);  

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
最后,将新加入到的元素安排到最后。
在这里插入图片描述

3.2 为什么设置升级?

  1. Redis是内存数据库,所以内存对于Redis来说非常的宝贵。相当于是用时间换空间。

  2. 提升了灵活性,对于上层使用者来说,他可以自由使用int16,int32,int64大小的数据。

  3. 因为intset是不会降级的,所以其时间消耗并不大,最多仅有2次的升级操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值