第五篇:Redis 为什么不用链表保存 List?QuickList 到底是什么?
Redis 为什么不用链表保存 ListQuickList 到底是什么上一篇我们讲了《Redis String 为什么不是 StringSDS 到底解决了什么问题》知道了 Redis 并没有直接使用 C 语言原生字符串而是重新设计了 SDS。今天继续来看 Redis 的另一个经典数据结构 —— List。很多人学习 Redis 时都会看到一句话Redis List 底层是双向链表。这句话曾经是对的但如果你今天还这样回答面试官大概率会被追问。因为Redis 早就不用传统链表保存 List 了。其实链表并没有我们想象中那么优秀。链表最大的优点是什么大学数据结构课上我们都学过链表。它最大的特点就是插入快、删除快、不用移动元素例如A - B - C插入一个 D。A - B - D - C只需要修改几个指针即可。时间复杂度O(1)看起来非常优秀所以很多人都会认为List 不就应该用链表吗Redis 最开始也是这么想的。为什么后来放弃了链表链表虽然插入快但它有两个非常致命的问题。第一非常浪费内存来看一个节点。Node ├── prev ├── next └── value真正的数据只有value另外两个指针完全是为了维护链表关系。假设保存100 万个元素那么就会多出200 万个指针在 64 位系统上每个指针通常占 8 字节意味着仅仅维护指针就可能消耗十几 MB 的内存对于 Redis 这种内存数据库来说这是非常昂贵的成本。第二CPU 不喜欢链表Redis 的性能并不仅仅来自算法还来自 CPU。来看两个数组。A B C D E F G它们连续存放 CPU 读取 A 的时候通常会把后面的B C D E一起加载进缓存下一次访问几乎不用访问内存。这就是CPU Cache但是链表呢可能变成A ------ 北京 B ------ 上海 C ------ 广州每个节点都在不同位置CPU 每访问一个节点都可能重新访问内存Cache 命中率非常低虽然理论时间复杂度一样实际速度却慢很多。Redis 想到了一个折中的办法既然连续内存访问快链表插入快那有没有可能**把两者结合起来**于是 Redis 想出了 ZipList它长这样---------------------------------- | A | B | C | D | E | F | G | ----------------------------------所有元素连续存储这样内存占用更少。CPU Cache 命中率更高。遍历速度非常快。很多小 List性能比链表好得多。ZipList 为什么又被淘汰了看到这里很多人会觉得那直接一直用 ZipList 不就好了问题来了如果现在A B C D E中间插入一个元素。A B X C D E后面的数据都要整体移动元素越多移动成本越高。另外ZipList 还有一个经典问题连锁更新Cascade Update。例如前一个节点长度变化后一个节点保存长度的字段也可能变化。于是一个节点变后面很多节点都要重新调整最坏情况下可能导致整个 ZipList 都发生更新这也是 Redis 后来放弃 ZipList 的重要原因。QuickList 是怎么诞生的Redis 的思路非常简单既然链表内存浪费ZipList 插入又慢那就不要让链表保存数据而是链表保存 ZipList最终变成--------- --------- --------- | ZipList | -- | ZipList | -- | ZipList | --------- --------- ---------每个节点不是一个元素而是一小段连续内存这就是QuickList它兼顾了两者优点。节点之间插入删除。仍然很快。每个节点内部连续存储。CPU Cache 命中率很高。指针数量大幅减少。内存占用更低这也是 Redis 3.2 开始采用 QuickList 的原因。为什么后来又出现了 ListPackRedis 并没有停止优化后来官方发现ZipList 本身还有不少设计缺陷。于是重新设计了一种结构ListPack相比 ZipList。它编码更加简单。避免连锁更新。内存利用率更高。更容易维护。于是现在的 Redis 真正使用的是QuickList │ ▼ ListPack也就是说 QuickList 没变只是里面保存的数据 从 ZipList 升级成了 ListPackRedis List 为什么一直在演进如果把整个过程串起来其实非常清晰最开始Redis 使用LinkedList后来发现 内存浪费Cache 不友好于是改成 ZipList后来又发现插入效率下降还有连锁更新。于是Redis 再次升级QuickList最后为了进一步优化内部又把ZipList ↓ ListPack整个演进过程如下LinkedList │ ▼ ZipList │ ▼ QuickList │ ▼ QuickList ListPack这也是为什么很多老文章已经过时了因为 Redis 的底层实现一直在不断优化。Redis 为什么最终选择 QuickList现在我们回到最开始的问题为什么不用链表保存 List答案其实很简单链表虽然插入快但是太占内存。Cache 命中率低。遍历性能一般。而连续内存虽然遍历快但插入代价又太高QuickList 正好结合了两者的优点既保留了链表灵活插入的能力又利用连续内存提高了遍历效率。因此它成为 Redis List 最终的实现方案这也是 Redis 一直坚持的设计思想没有绝对最好的数据结构只有最适合当前场景的数据结构。总结很多人记住了一句话Redis List 底层是链表。但真正理解 Redis 的人会知道这只是历史。Redis 为了性能经历了LinkedList ↓ ZipList ↓ QuickList ↓ QuickList ListPack每一次升级都不是推倒重来。而是在不断寻找内存占用、CPU Cache、插入效率、遍历性能之间的最佳平衡。这也是 Redis 能一直保持高性能的重要原因。上一篇《Redis String 为什么不是 StringSDS 到底解决了什么问题》下一篇《Redis 为什么使用跳表而不是红黑树》如果这篇文章让你第一次知道Redis List 早就不是链表了欢迎点赞、收藏。你以前回答过Redis List 底层是双向链表吗欢迎在评论区聊聊你的看法。

相关新闻

FreeRTOS源码详解(五)——挂起/释放调度器和Task

FreeRTOS源码详解(五)——挂起/释放调度器和Task

2026/6/29 18:00:43阅读更多 →
MSPM0 ADC与内部温度传感器:从原理到高精度温度监测实战

MSPM0 ADC与内部温度传感器:从原理到高精度温度监测实战

1. 项目概述:从模拟世界到数字世界的桥梁在嵌入式系统开发中,我们常常需要让微控制器(MCU)去“感知”物理世界。无论是监测电池电压、读取压力传感器的微弱信号,还是检查芯片自身的“体温”,这些连续变化的…

2026/6/29 17:55:42阅读更多 →
什么是卡森公式?

什么是卡森公式?

周末的午后,你打开收音机,调到常听的那个 FM 频率,音乐流淌而出——细腻、通透,连换气声都清晰可辨。你可能没意识到,这份清澈的背后,是电波在夜空中占用了一段相当宽的“空中车道”。而决定这条车道宽窄的…

2026/6/29 17:55:42阅读更多 →
基于AScript的SQL脚本语言发布啦!

基于AScript的SQL脚本语言发布啦!

一、介绍 支持SqlServer/MySql基础语法和数据类型: 支持SELECT查询语法:FROM/WHERE/LEFT JOIN/RIGHT JOIN/INNER JOIN/GROUP BY/ORDER BY/LIMIT支持INSERT插入语法支持UPDATE修改语法支持DELETE删除语法支持创建存储过程:Sqlserver/MySql语…

2026/6/29 19:16:02阅读更多 →
SpringBoot自动装配和starter

SpringBoot自动装配和starter

自动装配SpringBootApplication 注解中包含了EnableAutoConfiguration注解,这个注解底层又是import 注解,导入自动配置类导入选择器(AutoConfigurationImportSelecor ),这个选择器会去读取约定配置文件,从文…

2026/6/29 19:16:02阅读更多 →
统计学、数据科学、大数据管理,哪个更适合做数据?2026大学生选方向不迷路

统计学、数据科学、大数据管理,哪个更适合做数据?2026大学生选方向不迷路

很多同学想做数据,却卡在专业选择上:统计学偏理论,数据科学偏技术,大数据管理偏业务与治理。到了 2026 年,企业要的早已不是“会做表”的人,而是能把数据变成决策、产品和增长的人。也正因为这样&#xff0…

2026/6/29 19:16:02阅读更多 →
低功耗单片机MCU芯片主流型号盘点

低功耗单片机MCU芯片主流型号盘点

一、低功耗单片机MCU基础概念解析 低功耗单片机本质是集成度极高的微型控制芯片,行业内也常被称作MCU(微控制单元)。不同于普通微处理器,低功耗单片机通过超大规模集成电路技术,将CPU、运行内存RAM、存储ROM、外设接口…

2026/6/29 19:16:02阅读更多 →
AWS VPC 和 ALB 部署规范

AWS VPC 和 ALB 部署规范

覆盖网络架构设计、CloudFormation 模板、安全组规则、健康检查配置、部署检查清单。 一、命名规范 格式: {environment}-{project}-{resource-type}-{description}资源 格式 示例 VPC {project}-vpc govee-vpc 子网 `{project}-subnet-{public private}{n}-{az}` 路由表 `{pr…

2026/6/29 19:16:02阅读更多 →
深度解析GHelper:华硕ROG设备性能优化的专业替代方案

深度解析GHelper:华硕ROG设备性能优化的专业替代方案

深度解析GHelper:华硕ROG设备性能优化的专业替代方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Exp…

2026/6/29 19:11:02阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/29 3:27:55阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/29 2:19:08阅读更多 →
如何在3秒内从普通图片生成专业级法线贴图:DeepBump的终极指南

如何在3秒内从普通图片生成专业级法线贴图:DeepBump的终极指南

如何在3秒内从普通图片生成专业级法线贴图:DeepBump的终极指南 【免费下载链接】DeepBump Normal & height maps generation from single pictures 项目地址: https://gitcode.com/gh_mirrors/de/DeepBump 还在为3D建模中的纹理制作而烦恼吗?…

2026/6/29 0:01:47阅读更多 →
OCAuxiliaryTools:终极OpenCore配置工具,让黑苹果安装从未如此简单!

OCAuxiliaryTools:终极OpenCore配置工具,让黑苹果安装从未如此简单!

OCAuxiliaryTools:终极OpenCore配置工具,让黑苹果安装从未如此简单! 【免费下载链接】OCAuxiliaryTools Cross-platform GUI management tools for OpenCore(OCAT) 项目地址: https://gitcode.com/gh_mirrors/oc/OCA…

2026/6/29 0:01:47阅读更多 →
终极Windows 11精简指南:使用tiny11builder快速创建纯净系统镜像

终极Windows 11精简指南:使用tiny11builder快速创建纯净系统镜像

终极Windows 11精简指南:使用tiny11builder快速创建纯净系统镜像 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 你是否厌倦了Windows 11系统自带的20…

2026/6/29 0:01:47阅读更多 →