Redis(4)----浅谈整数集合

1,前言

整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现

Redis的其他数据结构相关如下:
简单动态字符串
链表
字典

2,整数集合

如果一个集合键中,其存储的元素都是整数值时,那么这个整数键的底层实现就会是整数集合

SADD numbers 1 3 5 7 9

# 查看这个集合键底层使用的是什么数据结构
OBJECT ENCODING numbers

2.1,结构

这个整数集合的相关结构如下:

typedef struct intset{

	//编码方式
	uint32_t encoding;

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

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

} intset;

2.1.1,contents

contents数组是整数集合的底层实现:整数集合的每个元素都是contents数组的每一个元素项,每个元素项在数组中按值的的大小从小到大有序地排列,并且数组中不存在重复项

2.1.2,length

该属性记录了contents数组中元素个数

2.1.3,encoding

虽然在上面提及到contents是一个int8_t的数组,但实际上contents保存什么类型的值取决于encoding的值
encoding有如下几种选项:

  • int8_t:用8位数字表示一个整数值(最小值是-32768,最大值是32767)
  • int32_t:用32位数字表示一个整数值(最小值是-2 147 483 648,最大值是2 147 483 647)
  • int64_t:用64位数字表示一个整数值(最小值是-9 223 372 036 854 775 808,最大值是9 223 372 036 854 775 807)

2.1.4,示例

在这里插入图片描述

  • encoding的值位INSET_ENC_INT16表示整数集合的底层实现为int16_t类型的数组,保存的是int16_t类型的整数值
  • length属性是5,表示该整数集合存储了五个元素
  • contents数组按从小到大的顺序存储元素
  • 因为每个集合元素都是int16_t类型的整数值,所以contents数组的大小等于80位

2.2,升级

假如有一个整数集合A,其内的contentsint16_t类型的数组,那么当我们往集合A中存储一个超过int16_t值范围的整数(假设该整数能用int32_t存储)时,就会触发升级,将整数集合进行升级
而这个升级步骤是这样的:

  1. 根据新元素的类型,扩展整数集合底层数组的空间大小,并为新元素分配空间
  2. 将底层数组的所有元素都转换为与新元素同类型,并将其放置到正确的位置,并且该过程中需要保证按从小到大的顺序进行存储
  3. 将新元素添加到底层数组中
  4. 然后将encoding的值改为INSET_ENC_INT32,并将length的值从3改为4

升级的好处

整数集合的升级策略有两个好处:

  • 提高整数集合的灵活性
    • 整数集合可以通过升级底层数组来适应新的元素,让使用者不必担心出现类型错误
  • 节约内存
    • 升级能让集合同时保存三种不同类型的值(这时的数组类型会为INSET_ENC_INT64),又可以确保升级只会在有需要的时候进行

降级

整数集合不支持降级操作,一旦对数组进行了升级,编码就会一直保持升级的状态

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值