文章参考:《Redis 设计与实现》黄建宏
压缩列表
压缩列表 ziplist 是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串, 那么Redis 就会使用压缩列表当列表键的底层实现。
例如:
redis> RPUSH lst 1 3 5 10086 "hello" "world"
(integer)6
redis> OBJECT ENCODING lst
"ziplist"
列表键里面包含的都是1、3、5、10086 这样的小整数值以及 "hello", "world" 这样的短字符串
压缩列表的构成
压缩列表是 Redis 为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序数据结构。一个压缩列表可以包含多个 entry, 每个 entry 可以保存一个字节数组或者一个整数值
例如一个包含3个节点的压缩列表
- zlbytes = 0x50, 表示压缩列表总长为 80 字节( 0x50(16进制) = 80(10进制) )
- zltail = 0x3c(60), 表示如果我们有一个指向压缩列表起始地址的指针p,那么p+60就可以计算出表尾节点 entry3 的地址
- zllen = 0x3(3), 表示压缩列表包含3个节点
entry 的构成
- Previous_entry_length 记录了压缩列表前一个字节的长度,所以程序可以根据指针运算,计算出前一个节点的起始地址
- encoding 记录了 content 保存的数据类型和长度
- content 负责保存节点的值,可以是一个字节数组或者整数