Redis 设计与实现(第六章) -- 整数集合(intset)

概述


1.intset概述

2.intset实现

3.intset升级

intset概述

整数集合是Redis集合键的底层实现之一,当值都为整数时,redis就会选择整数集合作为底层实现。

可以保存int16_t,int32_t,int64_t类型的整数值,并且集合中不会出现重复元素。

intset实现

先看下intset的数据结构:

typedef struct intset {
    uint32_t encoding;  //encoding方式
    uint32_t length;  //长度
    int8_t contents[]; //存储数组
} intset;

虽然contents[]声明了int8_t类型的数组,但实际上contents[]并不保存任何int8_t类型的数据,真正的数据类型取决于encoding的类型。

encoding类型有以下三种:

#define INTSET_ENC_INT16 (sizeof(int16_t))
#define INTSET_ENC_INT32 (sizeof(int32_t))
#define INTSET_ENC_INT64 (sizeof(int64_t))

intset升级

如果encoding类型为int_16,但是这时候需要保存个新元素,但是元素无法通过int16_t表示,这时就需要涉及到升级操作:

升级后所有元素会升级到对应升级后的类型,set中不会存在多种类型,而且升级后就无法降级;

升级步骤如下:

1.判断升级所需要的空间,分配空间大小;

2.将所有元素升级到与新元素相同的类型,并将转换类型后的元素添加到正确位置上;

3.将新元素添加到底层数组里面;

升级有什么好处?

1.提升灵活性

    因为C是静态类型的,为了避免错误,通常不会将两种不同类型保存在同一个数据结构中;但是升级能够支持保存int16_t,int32_t,int64_t的数据;

2.节约空间

   如果保存的数据只有int16_t,那分配一个int64_t的空间是造成空间的浪费,所以最开始值分配int16_t的空间,如果需要添加int32_t,int64_t的数据,再进行升级。

 

posted on 2017-09-27 17:12  qiezijiajia 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/dpains/p/7602805.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值