作者:Jamie-逗比 | 来源:互联网 | 2023-12-12 16:06
本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。
文章参考:《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 负责保存节点的值,可以是一个字节数组或者整数