Redis QuickList底层原理详解

前言

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

1. ZipList数据结构的不足

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

2. QuickList

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

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

在这里插入图片描述

怎么限制每个 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 包中

在这里插入图片描述

quicklistNode 源码在src/quicklist 包中

在这里插入图片描述

2.2 QuickList 内存结构图

在这里插入图片描述
如上图所示,这里配置二咯 compress 为1,说明首尾各有一个节点不进行压缩得,其他节点要进行压缩

3. 总结

QuickList的特点:

  • 它是一个节点为ZipList的双端链表
  • 每个节点采用ZipList,解决传统链表的内存占用问题
  • 控制了 ZipList 的大小,解决连续内存空间申请效率的问题
  • 节点可以进行压缩,节省了内存
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值