压缩列表( ziplist) 是列表键和晗希键的底层实现之一。当一个列表键只包含少量 列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么 Redis 就 会使用压缩列表来做列表键的底层实现。
压缩列表是 Redis 为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构。一个压缩列表可以包含任意多个节点,每个节点可以 保存一个字节数组或者一个整数值。
数据结构
压缩列表结构
zlbytes zltail zllen entry1 endtry2 ... entryN zlend
zlbytes :四个字节,记录了整个压缩列表总共占用了多少字节数
zltail :四个字节,记录压缩列表表尾节点距离压缩列袤的起始地址有多少字节:通过这个偏移量程序无须遍历整个压缩列表就可以确定表尾节点的地址
zllen :两个字节,记录了整个压缩列表中总共包含几个endtry节点
entryx:非固定字节,记录的是单个节点
zlend: 0xFF 一个字节,十进制的值为 255,标志压缩列表的结尾
entry结构
previous_entry_length encoding content
previous_entry_length 属性以字节为单位,记录了压缩列表中前一个节点的长度,可以是1字节或者5字节
如果前一节点的长度小于254字节,previous_entry_length占用1字节,具体的长度局存在这1字节中
如果前一节点的长度大于等于254字节,previous_entry_length占用5字节,且第一字节设