Redis内部数据结构详解(5)——quicklist

是这样的,想请讲解下,Redis内部数据结构详解(5)——quicklist
最新回答
小晴日记

2026-10-21 21:19:56

quicklist是Redis在3.2版本之后引入的一种内部数据结构,用于优化列表(list)的存储效率与性能。它结合了ziplist(压缩列表)和linkedlist(双向链表)的优点,通过控制每个节点的ziplist大小来平衡内存使用和访问效率。

  • 设计背景:

    Redis早期使用ziplist存储列表,但ziplist在数据量大时插入/删除效率低。

    后来改用linkedlist,但每个节点独立分配内存,内存碎片化严重。

    quicklist应运而生,通过将多个ziplist串联成双向链表,兼顾了内存局部性和操作灵活性。

  • 核心结构:

    quicklistNode:链表节点,包含一个ziplist的指针(zl)、节点大小(count)、前后节点指针(prev/next)等。

    quicklist:顶层结构,包含头尾节点指针(head/tail)、节点数量(len)、每个ziplist的默认大小限制(fill)等配置。

  • 关键特性:

    内存优化:通过fill参数控制每个ziplist的节点数(如默认8KB),避免单个ziplist过大。

    快速访问:支持双向遍历,头部/尾部插入/删除为O(1)复杂度。

    压缩选项:可通过compress参数对非首尾节点进行LZF压缩,进一步节省内存。

  • 操作示例:

    插入数据:当数据量较小时,直接插入当前ziplist;超过限制则新建节点。

    查找数据:先定位到quicklistNode,再在ziplist中二分查找(若启用REDIS_ENCODING_ZIPLIST优化)。

    删除数据:调整ziplist内数据或合并/分裂节点。

  • 配置参数:

    list-max-ziplist-size:控制每个ziplist的最大大小(正数表示节点数,负数表示内存限制)。

    list-compress-depth:控制压缩深度(如0表示不压缩,1表示仅首尾节点不压缩)。

  • 优势总结:

    内存效率:比纯linkedlist减少碎片,比纯ziplist支持更大容量。

    性能平衡:头部/尾部操作高效,随机访问通过ziplist二分查找优化。

    灵活性:可配置压缩和ziplist大小,适应不同场景。

应用场景:quicklist适用于Redis中所有列表类型操作(如LPUSH、RPOP、LRANGE),尤其在数据量中等(数千至数万元素)时表现最佳。