Redis数据结构 — QuickList

quicklist是Redis中实现的一个数据结构,它使用双向链表结合压缩列表ZipList来存储数据,从而节省内存。每个quicklistNode包含一个指向压缩列表的指针,元素存储在ZipList中。为了避免连锁更新和控制内存使用,Redis提供了list-max-ziplist-size配置,限制ZipList的大小。这种设计在节省内存的同时,也带来了扩展时额外的内存开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

quicklist 结构设计

总结


quicklist 结构设计

quicklistNode 结构体里包含了前一个节点和下一个节点指针,这样每个 quicklistNode 形成了一个双向链表。但是链表节点的元素不再是单纯保存元素值,而是保存了一个压缩列表,所以 quicklistNode 结构体里有个指向压缩列表的指针 *zl。

在向 quicklist 添加一个元素的时候,不会像普通的链表那样,直接新建一个链表节点。而是会检查插入位置的压缩列表是否能容纳该元素,如果能容纳就直接保存到 quicklistNode 结构里的压缩列表,如果不能容纳,才会新建一个新的 quicklistNode 结构。

quicklist 会控制 quicklistNode 结构里的压缩列表的大小或者元素个数,Redis提供了一个配置项:list-max-ziplist-size来限制,来规避潜在的连锁更新的风险,但是这并没有完全解决连锁更新的问题。

如果值为正,则代表ZipList的允许的entry个数的最大值
如果值为负,则代表ZipList的最大内存大小,分5种情况,默认值为-2:

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

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

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

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

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

总结

QuickList的特点:

  • 是一个节点为ZipList的双端链表

  • 节点采用ZipList,解决了传统链表的内存占用问题

  • 控制了ZipList大小,解决连续内存空间申请效率问题

  • 中间节点可以压缩,进一步节省了内存

缺点:内存增加,每扩展一次节点,都要记录其头信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值