Redis QuickList底层原理详解

文章目录

  • 前言
  • 1. ZipList数据结构的不足
  • 2. QuickList
    • 2.1 QuickList 数据结构
    • 2.2 QuickList 内存结构图
  • 3. 总结

前言

QuickList 是针对 ZipList 在设计上的不足而新增的一种数据结构,对 ZipList 数据结构比较陌生的同学可以先学习一下 ZipList 在来学习。

1. ZipList数据结构的不足

  • 不能保存过多的元素,否则访问性能会降低
  • 不能保存过大的元素,否则容易导致内存重新分配,甚至会引发连锁更新的问题。连锁更新,简单来说,就是 ZipList 中的每一项都要被重新分配内存空间,造成 ZipList 的性能降低

2. QuickList

如果要存储大量数据,超出了 ZipList 最佳的上限,那么可以创建多个 ZipList 来分片存储数据,这多个 ZipList 如何建立联系?

QuickList数据结构是Redis在3.2版本引入的一种新得数据结构,他是一个双端链表,链表中的每个节点都是一个 ZipList,如下图所示

Redis QuickList底层原理详解_第1张图片

怎么限制每个 ZipKList 的长度和大小?

通过:list-max-ziplist-size 配置项来限制

  • 如果值为正,则代表ZipList 的允许的 entry 个数的最大值
  • 如果值为负,则代表 ZipList 的允许的最大内存大小,分五种情况(默认值为-2):
    -1:每个ZipList的内存占用不能超过4kb
    -2:每个ZipList的内存占用不能超过8kb
    -3:每个ZipList的内存占用不能超过16kb
    -4:每个ZipList的内存占用不能超过32kb
    -5:每个ZipList的内存占用不能超过64kb

2.1 QuickList 数据结构

quicklist 源码在 src/quicklist 包中

Redis QuickList底层原理详解_第2张图片

quicklistNode 源码在src/quicklist 包中

Redis QuickList底层原理详解_第3张图片

2.2 QuickList 内存结构图

Redis QuickList底层原理详解_第4张图片
如上图所示,这里配置二咯 compress 为1,说明首尾各有一个节点不进行压缩得,其他节点要进行压缩

3. 总结

QuickList的特点:

  • 它是一个节点为ZipList的双端链表
  • 每个节点采用ZipList,解决传统链表的内存占用问题
  • 控制了 ZipList 的大小,解决连续内存空间申请效率的问题
  • 节点可以进行压缩,节省了内存

你可能感兴趣的:(Redis,redis,数据库)