redis自学(5)QuickList

问题1ZipList虽然节省内存,但申请内存必须是连续空间,如果内存占用较多,申请内存效率很低。怎么办?

为了缓解这个问题,我们必须限制ZipList的长度和entry大小。

问题2:但是我们要存储大量数据,超出了ZipList最佳的上限怎么办?

我们可以创建多个ZipList来分片存储数据。

问题3:数据拆分后比较分散,不方便管理和查找,这多个ZipList如何建立联系?

Redis3.2版本引入了新的数据结构QuickList,它是一个双端链表,只不过链表中的每个节点都是一个ZipList

 

 

为了避免QuickList中的每个ZipList中的entry过多,Redis提供了一个配置项:list-max-ziplist-size来限制。

 如果值为正,则代表ZipList的允许的entry个数的最大值。

 如果值为负,则代表ZipList的最大内存大小,分5中情况:

  -1:每个ZipList的内存占用不能超过4kb

  -2:每个ZipList的内存占用不能超过8kb

  -3:每个ZipList的内存占用不能超过16kb

  -4:每个ZipList的内存占用不能超过32kb

  -5:每个ZipList的内存占用不能超过64kb

其默认值为-2

 

 

除了控制ZipList的大小,QuickList还可以对节点的ZipList做压缩。通过配置项list-compress-depth来控制。因为链表一般都是从首尾访问较多,所以首尾不压缩的。这个参数是控制首尾不压缩的节点个数:

0:特殊值,代表不压缩

1:表示QuickList的首尾各有1个节点不压缩,中间节点压缩

2:表示QuickList的首尾各有2个节点不压缩,中间节点压缩

以此类推

默认值:0

QuickList的结构

QuickListNode的结构

QuickList内存结构图

 

 

posted @   蓝海的bug本  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示