redis 数据结构 整数集合和压缩列表

整数集合

结构:

typedef struct intset{
    uint32_t encoding;//编码,表明content内保存的整型的类型
    uing32_t length;//数组的长度
    int8_t contents[];// 虽然是int8_t类型,但是真实保存的数据,由encoding指定,这里只做位的存储
}
encoding 说明
  • *

要点

  1. intset,保存的值是升序的,并且不会重复
  2. intset中如果有一个数超过当前encoding的上下限,整个set都会升级,以满足存放更长数字的需求,但是,删除超过限制的数字后,intset并不会降级,也就是说,升级是单向的
  3. 升级的好处:
    • 节省内存
    • 提高灵活性:静态语言不允许类型不同的整数类型混合,但是通过升级,可以做到这一点,在节省了内存之余,提高了灵活性

redis内的使用

  • 在集合对象中使用

压缩列表

压缩列表是为了在数据较少的时候压缩空间使用的,所以结构十分的,“崎岖”。各种分情况而定的字节结构

结构

一个压缩列表包含
  • zlbyte:4个字节,记录整个压缩列表的字节数
  • zltail:4个字节,记录表头到表尾跨过的字节数,这样就允许直接从表头找到表尾
  • zllen:2个字节,记录节点个数,最多记录2^16-1 = 65535个,超过这个数字,需要遍历整个列表确认节点数
  • entry:节点,若干个,连续存储,长度都不定,由对象内结构指定
  • zlend:1个字节,列表结束标志,=0xFF
entry结构
  • previous_entry_length:1字节或者5字节,保存前一个节点的长度的字节数;当前一个节点长度小于254,则该字段为1字节,否则该字段为5字节,第一个字节为0xFE
  • encoding:表明节点content存储的数据类型。如果1个字节长,并且开头两位为11,则表明是存储的是整型,并且整型的类型由其后6位二进制位表明;如果enconding长度为1个字节,2个字节,5个字节,值的最高位对应是00,01,10,则表示存储的字节数组,字节数组的长度由后面的6位,14位,38位二进制位表示,单位字节。
  • content:可以存储字节数组或者整型值,类型由enconding指定

要点:

  1. 连锁更新:存在这样的可能性,本来一个压缩列表中各个节点的大小都小于254,但是,增加一个节点,导致节点大小大于254,previous_entry_value扩大,进而导致其后的每一个节点的previous_entry_value都扩大的情况;自然也有每个节点恰好都大于等于254,删除一个节点后,previous_entry_value变化,导致其后所有节点previous_entry_value都变小的情况。连锁更新是比较消耗性能的,但是分析下来,这种情况出现概率较小,在连锁的节点较少的情况下也不会产生问题。

redis内使用

列表键和哈希键,少量数据时使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值