压缩列表(ziplist)是由一个连续内存组成的顺序型数据结构。一个压缩列表可以包含任意多个节点,每个节点上可以保存一个字节数组或整数值。它是Redis为了节省内存空间而开发的。 压缩列表(ziplist)是哈希(hash)和有序集合(zset)的内部编码之一。当哈希(hash)中的元素个数比较少并且每个元素的值占用空间比较小的时候,Redis就会使用压缩列表做为哈希的内部编码。当有序集合(zset)中的元素个数比较少并且每个元素的值占用空间比较小的时候,Redis也会使用压缩列表做为有序集合的内部编码。 接下来,我们来看以下压缩列表的内部构造,压缩列表由以下几个部分组成: 每个压缩列表的节点由三部分组成: prevlen 、 encoding 和 content 。 prevlen :表示该节点前一个节点的字节长度。 prevlen 的长度可能是1个字节,也可能是5个字节。 当前一个节点的长度小于254个字节时, prevlen 的长度为1个字节,直接存储前一个节点的字节长度; 当前一个节点的长度大于或等于254个字节时, prevlen 的长度为5个字节,其中的第一个字节被设置为0xFE,随后的四个字节保存前一个节点的字节长度。 可以通过 prevlen 和压缩列表结构中的 xltail 逆序遍历压缩列表。 encoding 表示该节点中保存数据的类型和长度。 当 encoding 的最高位以00开头时,表示最大长度为63的短字符串,此时 encoding 的长度为1个字节,其后面6个位表示字符串的字节长度; 当 encoding 的最高位以01开头时,表示最大长度为16383的中等长度的字符串,此时 encoding 的长度为2个字节,其后面14个位表示字符串的字节长度; 当 encoding 的最高位以10开头时,表示最大长度为4294967295的特长的字符串,此时 encoding 的长度为5个字节,其后面4个字节表示字符串的字节长度; 当 encoding 的最高位以11开头时,表示整数值,此时 encoding 的长度为1个字节,其后面6个位表示整数值的类型和长度。 content 用于存储节点的值,节点的值可以是一个字节数组,也可以是正数,其类型和长度由 encoding 决定。 压缩列表(ziplist)是由一个连续内存组成的顺序型数据结构。 一个压缩列表可以包含任意多个节点,每个节点上可以保存一个字节数组或整数值。 压缩列表(ziplist)是哈希(hash)和有序集合(zset)的内部编码之一。