压缩列表介绍压缩列表(ziplist)是由连续内存组成的顺序数据结构。压缩列表可以包含任意数量的节点,每个节点可以包含一个字节数组或一个整数值。它是Redis为了节省内存空间而开发的。压缩列表(ziplist)是散列(hash)和有序集(zset)的内部编码之一。当散列(hash)中的元素个数比较少,每个元素的值占用空间比较小的时候,Redis会使用压缩列表作为散列的内部编码。当有序集(zset)中的元素个数比较少,每个元素的值占用空间比较小的时候,Redis也会使用压缩列表作为有序集的内部编码。压缩列表结构接下来我们看一下下面压缩列表的内部结构。压缩列表由以下几部分组成:zlbytes:表示整个压缩列表占用内存的字节数。xltail:表示从压缩列表的起始地址到最后一个节点的字节数,可以快速找到最后一个节点。zllength:表示压缩列表中包含的节点数。条目:节点列表,彼此紧邻存储。zlend:特殊值0xFF(十进制为255),表示压缩列表的结尾。压缩列表节点结构每个压缩列表节点由三部分组成:prevlen、编码和内容。prevlenprevlen:表示本节点的前一个节点的字节长度。prevlen的长度可以是1个字节或5个字节。当前一个节点的长度小于254字节时,prevlen的长度为1字节,直接存储前一个节点的字节长度;当前一个节点的长度大于或等于254字节时,prevlen的长度为5个字节,第一个字节设置为0xFE,后面的四个字节为前一个节点的字节长度。通过压缩列表结构中的prevlen和xltail可以逆序遍历压缩列表。encodingencoding表示节点中存储的数据的类型和长度。当编码的最高位以00开头时,表示一个最大长度为63的短字符串,此时编码的长度为1字节,后面的6位表示字符串的字节长度;当编码的最高位以01开头时,表示一个中等长度的字符串,最大长度为16383。此时编码的长度为2字节,后面的14位表示字节长度字符串;当编码的最高位以10开头时,表示一个超长字符串,最大长度为4294967295。此时编码的长度为5个字节,后面的4个字节表示字符串的字节长度;当编码的最高位以11开头时,表示一个整数值。此时编码的长度为1字节,后面的6位表示整数值的类型和长度。content内容用于存储节点的值。节点的值可以是字节数组或正数,其类型和长度由编码决定。总结压缩列表(ziplist)是由连续内存组成的顺序数据结构。压缩列表可以包含任意数量的节点,每个节点可以包含一个字节数组或一个整数值。压缩列表(ziplist)是散列(hash)和有序集(zset)的内部编码之一。这点我早就看出来了,你我一定是有缘,留下你的喜欢和关注,你日后必成大器。
