整数集合
结构:
typedef struct intset{
uint32_t encoding;//编码,表明content内保存的整型的类型
uing32_t length;//数组的长度
int8_t contents[];// 虽然是int8_t类型,但是真实保存的数据,由encoding指定,这里只做位的存储
}
encoding 说明
- *
要点
- intset,保存的值是升序的,并且不会重复
- intset中如果有一个数超过当前encoding的上下限,整个set都会升级,以满足存放更长数字的需求,但是,删除超过限制的数字后,intset并不会降级,也就是说,升级是单向的
- 升级的好处:
- 节省内存
- 提高灵活性:静态语言不允许类型不同的整数类型混合,但是通过升级,可以做到这一点,在节省了内存之余,提高了灵活性
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指定
要点:
- 连锁更新:存在这样的可能性,本来一个压缩列表中各个节点的大小都小于254,但是,增加一个节点,导致节点大小大于254,previous_entry_value扩大,进而导致其后的每一个节点的previous_entry_value都扩大的情况;自然也有每个节点恰好都大于等于254,删除一个节点后,previous_entry_value变化,导致其后所有节点previous_entry_value都变小的情况。连锁更新是比较消耗性能的,但是分析下来,这种情况出现概率较小,在连锁的节点较少的情况下也不会产生问题。
redis内使用
列表键和哈希键,少量数据时使用