ZipList(压缩列表):
1. 介绍:
内存连续,无序的数据结构.压缩列表是redis为了节约内存而开发的,由一系列特殊编码的连续内存块 组成的顺序型数据结构.
2. 组成:
3. 压缩列表节点的组成
- 一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值.
1) previous_entry_length
- 无符号(1字节) 0到255
2^8-1 >> 255(10进制) FF(16进制) 二进制 1111 1111 8bit - 有符号(1字节)-128到127
- 无符号(2字节) 0到65535
2^16-1 >> 65535(10进制) FFFF(16进制) 二进制 1111 1111 1111 1111 16bit - 有符号(2字节) -32768到32765
- 无符号(4字节) 0到4294967295
2^32-1 >> 4294967295(10进制) FFFF FFFF(16进制) 二进制 1111 1111 1111 1111 1111 1111 1111 1111 32bit - 有符号(4字节)-2147483648到2147483647
- pervious_entry_length属性以字节为单位,记录了压缩列表中前一个节点的长度.
- 如果前一节点的长度小于254个字节,那么previous_entry_length属性,只需要一个单独的字节(无符号8bit整型)代表长度.
< prev len(上个节点长度) from 0 to 253 > < encoding > < entry >
例: 0x0F; 长度15字节: 表示方式:计算机 >> 0000 1111(2) ( 15(10进制) / 0x0F(16进制) ) - 如果前一节点的长度大于等于254字节,那么previous_entry_lenght属性长度为5字节;其中第一个字节会被设置为0xFE(十进制254/二进制 1111 1110),而之后的字节则用于保存前一节点的长度.
0xFE < 4字节无符号小端prevlen > < encoding > < entry >
例:0xFE FF FF FF FF; 0x表示:16进制;FE表示previous_entry_lenght占5个字节的长度(FE本身占一个字节). 之后的4个字节FF FF FF FF表示上一个节点的长度. FF FF FF FF(16) >> 4294967295(10) >> 二进制 1111 1111 1111 1111 1111 1111 1111 1111
程序可以通过指针运算,根据当前节点的起始地址来计算前一节点的起始地址.
- 如果前一节点的长度小于254个字节,那么previous_entry_length属性,只需要一个单独的字节(无符号8bit整型)代表长度.
- encoding属性(字节数组编码) : 记录 节点的content属性所保存数据的类型以及长度.
- 字节数组编码: encoding属性值 二进制最高位的两位 00 / 01 /10(字节数组编码)表示节点的content属性保存的是字节数组,数组的长度为除去二进制最高两位之后的其他位记录;
00 : encoding属性值为一个字节; 01 : encoding属性值为两个字节; 10 :encoding属性值为 5个字节;
字节数组编码 (二进制) | 字节数组编码长度 | content属性保存的值 |
---|---|---|
00xx xxxx | 1B(8bit) | content字节数组长度小于等于63(2^ 6-1)字节, "xx xxxx"代表无符号的6位长度 |
01xx xxxx aaaa aaaa | 2B(16bit) | content字节数组长度小于等于16 383(2^ 14-1)字节, "xx xxxx aaaa aaaa"是以大端序列排序 |
1000 0000 aaaa aaaa bbbb bbbb cccc cccc dddd dddd | 5B(40bit) | content字节数组长度小于等于4 294 967 295(2^32-1)字节,第一个字节的低6位没有用,并且被置成0; 32位数被以大端序列排序。 |
- 整数编码: encoding属性值 二进制最高位两位 11 (整数编码)表示节点的content属性保存的是整数值;
整数编码 | 整数编码长度 | content属性保存的值 |
---|---|---|
1100 0000 | 1B(8bit) | int 16_t类型的整数(2个字节),值为0xC0 |
1101 0000 | 1B(8bit) | int 32_t类型的整数(4个字节),值为0xD0 |
1110 0000 | 1B(8bit) | int 64_t类型的整数(8个字节),值为0xE0 |
1111 0000 | 1B(8bit) | 24位有符号整数(3个字节),值为0xF0 |
1111 1110 | 1B(8bit) | 8位有符号整数(1个字节),值为0xF0 |
1111 xxxx | 1B(8bit) | 使用这一个编码的节点没有content属性 |
1111 xxxx >> (xxxx的值在0001和1101之间).这是一种特殊情况,xxxx从1到13一共13个值,这时就用这13个值来表示真正的数据. 注意, 这里是表示真正的数据, 而不是数据长度. 也就是说, 再这种情况下, 后面不再需要一个单独的 content 属性来表示真正的数据了, 而是 encoding 和 content合二为一. 另外, 由于xxxx只能取0001到1101之间这13个值( 其他可能的值和其他情况冲突,比如0000和1110分别同 24位有符号整数 和 8位有符号整数 情况冲突, 1111跟结束标记冲突 ), 而小数值应该从0开始,因此13个值分别表示0-12, 即xxxx的值减去1才是它所要表示的那个整数数据的值.
- content属性 : 负责保存节点的值, 节点值可以是一个字节数组或者整数, 值的类型和长度由节点的 encoding 属性来决定.
来源:CSDN
作者:生命中的羁绊
链接:https://blog.csdn.net/qq_42378705/article/details/104596085