redis中list类型中的ziplist笔记

  • Post author:
  • Post category:其他




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

  1. 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

      程序可以通过指针运算,根据当前节点的起始地址来计算前一节点的起始地址.

  2. 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才是它所要表示的那个整数数据的值.


  1. content属性 : 负责保存节点的值, 节点值可以是一个字节数组或者整数, 值的类型和长度由节点的 encoding 属性来决定.


    在这里插入图片描述



版权声明:本文为qq_42378705原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。