![Redis数据结构三之压缩列表-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码](https://zhuji.vsping.com/wp-content/uploads/2023/05/redis-220x150.jpg)
Redis数据结构三之压缩列表
本篇笔记介绍压缩列表。 在 Redis 3.2 版本之前,压缩列表是列表对象、哈希对象、有序集合对象的的底层实现之一。 因为压缩列表本身结构上的一些缺陷,压缩列表这个结构被替换了,但是压缩列表结构本身有一些可取之处,并且替换它的新结构 listpack 与之很相似,所以我们这里还是介绍一下压缩列表的结构和存储 1、压缩列表的结构 压缩列表是 Redis 为了节约内存而开发的,由一个连续内存块组成的顺序型数据结构。 它的组成结构如下: | zlbytes | zltail | zllen | entry1 | entry2 | ... | entryN | zlend | 压缩列表的英文名是 ziplist,所以它的属性都是 zl 开头。 1. 列表属性介绍 zlbytes zlbytes 长度为 4 字节,记录整个压缩列表占用的内存字节数 zltail zltail 长度为 4 字节,记录压缩列表最后一个节点,也就是我们结构示例中的 entryN 到 zlbytes 的地址之间的偏移量。 zllen zllen 长度为 2 字节,记录的是压缩列表包含的节点数量,也就是结构中的 N。 zlend zlend 长度为 1 字节,它的值为 0xFF(十进制 255),用于标记压缩列表的末端。 2. 压缩列表节点属性介绍 对于每一个 entry 节点,也就是压缩列表中的元素节点,它的结构示意如下: | previous_entry_length | encoding | content | previous_entry_length previous_entry_length 属性记录的是压缩列表中前一个节点的长度 previous_entry_length 属性本身的长度可以是 1 字节或者 5 字节 如果前一节点的长度小于 254 字节,那么 previous_entry_length 属性的长度为 1 字节,前一个节点的长度保存在这个字节里 如果前一节点的长度大于等于 254 字节,那么 previous_entry_length 属性的长度为 5 字节,第一个字节被设置成 0xFE(也就是 254),之后的四个字节用于前一节点的长度。 通过 previous_entry_length 属性,我们可以通过当前节点的地址和 previous_entry_length 属性,计算出前一个节点的起始地址,压缩列表的从表尾到表头的遍历操作就是使用这个原理一个节点一个节点往前回溯实现的。 encoding encoding 属性记录了节点的 content 属性所保存数据的类型以及长度。 encoding 的值如果是一字节长,且值的最高位以 11 开头,那么表示是整数编码,表示 content 属性保存着整数值。 encoding 的值为 一字节、两字节、五字节长,且值的最高位为 00、01、10 则表示是字节数组编码...