第八篇:Redis 为什么不会每次修改都写磁盘?
Redis 为什么不会每次修改都写磁盘上一篇我们聊了《Redis 为什么要同时支持 RDB 和 AOF》了解了 Redis 在持久化设计上的取舍。RDB 通过保存某个时间点的数据快照让 Redis 可以快速恢复数据但是两次快照之间的数据可能丢失。AOF 通过记录每一次写操作让 Redis 尽可能减少数据丢失但是随着运行时间增加日志文件会越来越大。所以 Redis 最终选择了两种方案结合。但是 AOF 又带来了一个新的问题既然 AOF 可以记录每一次修改那为什么 Redis 不直接在每一次修改之后把数据同步到磁盘这样不是最安全的吗例如客户端执行 SET↓修改内存数据↓写入 AOF↓同步磁盘↓返回成功如果按照这个流程执行Redis 返回成功时数据已经真正保存到了磁盘。看起来这是一个完美方案。但是 Redis 并没有这么设计。原因是Redis 追求的并不是绝对的数据安全而是在接近内存速度的情况下提供足够可靠的数据恢复能力。如果每一次修改都等待磁盘完成Redis 最核心的优势反而会消失。Redis 为什么不能每次修改都写磁盘Redis 快的原因大家通常会想到“因为 Redis 使用内存。”这个答案没有错但是不完整。真正决定 Redis 性能的是它的大部分操作都发生在内存中。例如执行SET user:name redisRedis 需要做的事情非常简单接收命令↓解析命令↓修改内存数据结构↓返回结果整个过程没有磁盘参与。但是如果增加持久化接收命令↓修改内存数据结构↓写入磁盘↓等待磁盘完成↓返回结果问题就出现了。内存和磁盘的速度差距非常大。CPU 访问内存可能只需要几十纳秒而一次磁盘 IO即使 SSD也需要微秒甚至更长时间。如果 Redis 每执行一次写操作都必须等待磁盘完成那么 Redis 的性能上限就不再由 CPU 和内存决定而是由磁盘决定。对于一个追求高并发的内存数据库来说这是无法接受的。那为什么不用 write 代替磁盘同步很多人可能会想到既然同步磁盘太慢那只写文件不等待不就行了吗实际上Redis 的 AOF 写入确实不会每次都直接等待磁盘。因为 Linux 文件写入本身也有缓存机制。整个过程大致如下Redis|| write()↓操作系统 Page Cache|| fsync()↓磁盘Redis 调用 write 后数据首先进入操作系统缓存。例如write(fd, buffer, size);这个操作只是把数据交给操作系统。此时数据并不一定已经保存到了磁盘。如果机器突然断电Redis 内存↓丢失操作系统缓存↓可能丢失磁盘已保存数据↓保留所以真正保证数据落盘需要fsync(fd);fsync 会要求操作系统把缓存中的数据同步到磁盘。因此write 解决的是“写入文件”。fsync 解决的是“真正保存”。fsync 为什么不能频繁执行既然 fsync 才安全那 Redis 为什么不每次执行因为 fsync 太慢。假设 Redis 每秒处理 10 万次写请求。如果每次请求write()fsync()那么意味着磁盘需要每秒完成大量同步写操作。更严重的是fsync 会阻塞当前线程。Redis 早期核心命令执行模型是单线程客户端请求↓Redis 主线程↓执行命令↓返回结果如果加入客户端请求↓Redis 主线程↓执行命令↓等待 fsync↓返回结果那么一个磁盘慢操作就会阻塞整个 Redis。这也是 Redis 设计中非常重要的一点Redis 可以接受后台任务慢但不能接受主线程慢。因为主线程负责处理所有客户端请求。Redis 如何解决这个问题Redis 的方案是不要让写磁盘阻塞命令执行。也就是说数据修改和数据刷盘分开。客户端请求执行命令↓修改内存↓写入 AOF 缓冲区↓返回成功后台AOF 缓冲区↓后台任务↓fsync↓磁盘这样 Redis 主线程可以继续处理新的请求。这就是 Redis 持久化设计中的一个核心思想把影响性能的慢操作从核心请求链路中移出去。Redis 为什么选择 everysec既然刷盘放到了后台那么新的问题来了多久刷一次Redis 提供了三个策略appendfsync alwaysappendfsync everysecappendfsync no它们代表不同的数据安全选择。always最高安全但是牺牲性能always 表示每一次写操作都立即 fsync。流程执行命令↓写 AOF↓fsync↓返回成功这种方式数据安全最高。因为客户端收到成功响应时数据已经保存到了磁盘。但是性能最低。因为每一个请求都可能等待磁盘。对于高并发业务这种方式基本无法发挥 Redis 的优势。everysec性能和安全的平衡everysec 是 Redis 默认策略。流程客户端请求↓修改内存↓写入 AOF↓返回成功↓后台每秒 fsync它的核心思想允许极少量数据丢失换取更高性能。例如10:00:00写入数据10:00:01后台刷盘如果 Redis 在中间发生异常最多丢失最近一秒的数据。对于大部分互联网业务用户登录状态热点数据缓存信息非核心计数这种程度的数据损失通常可以接受。所以 Redis 选择不是保证每一次操作绝对安全而是保证大多数情况下数据可靠。no完全交给操作系统no 模式Redis 只负责write()什么时候同步磁盘由操作系统决定。这种方式性能最高。但是风险也最高。因为 Redis 无法控制操作系统什么时候刷盘缓存中积累了多少未保存数据所以生产环境通常不会使用。AOF Rewrite日志为什么不会无限增长解决刷盘问题之后AOF 又出现了新的问题。AOF 记录的是操作过程。例如SET count 1SET count 2SET count 3SET count 4这些命令都会保存。但是 Redis 最终状态count 4前面的SET count 1SET count 2SET count 3实际上已经没有意义。如果 Redis 长时间运行大量历史命令↓AOF 文件不断增长↓恢复时间越来越长所以 Redis 引入了AOF RewriteRewrite 并不是简单压缩文件而是根据当前内存状态重新生成 AOF。例如原来的SET count 1SET count 2SET count 3SET count 4重新生成SET count 4恢复时只需要执行最终状态。为什么 Rewrite 不会影响 Redis如果 Rewrite 在主线程执行Redis 主线程↓生成 AOF 文件↓无法处理请求这显然不可接受。所以 Redis 使用子进程完成 Rewrite。流程Redis 主进程继续处理客户端请求↓子进程生成新的 AOF↓期间新的写操作进入重写缓冲区↓合并数据↓替换旧文件Redis 再一次体现了自己的设计原则耗时操作异步化核心路径保持简单。Redis 为什么最终选择这种持久化方式如果 Redis 每次修改都立即写磁盘数据安全最高。但是性能会明显下降。如果 Redis 完全不考虑磁盘性能最高。但是数据无法恢复。所以 Redis 最终选择内存快速执行↓后台异步刷盘↓保证数据恢复能力RDB 解决的是如何快速保存某个时间点的数据。AOF 解决的是如何记录数据变化过程。everysec 解决的是如何避免磁盘影响 Redis 性能。Rewrite 解决的是如何控制 AOF 文件规模。Redis 从来没有追求一个绝对完美的方案而是在性能、可靠性和复杂度之间寻找一个工程上的平衡。这也是 Redis 能够长期保持高性能同时又具备持久化能力的原因。上一篇《Redis 为什么要同时支持 RDB 和 AOF》下一篇《Redis 为什么会发生缓存穿透、击穿、雪崩》

相关新闻

Kimi K3 Max统计审计错误分析:大模型数值计算与验证框架

Kimi K3 Max统计审计错误分析:大模型数值计算与验证框架

这次我们来看一个关于 Kimi K3 Max 统计审计出错的技术分析。这个案例来自 Ethan Mollick 的观察,涉及大模型在数据统计和审计场景下的可靠性问题。对于依赖 AI 进行数据分析、报告生成或审计工作的团队来说,这类错误可能带来实质性风险。Kimi K3 Max 作…

2026/7/24 11:25:35 阅读更多 →
C#接口在Unity游戏开发中的实战应用:以IAttackable构建可扩展战斗系统

C#接口在Unity游戏开发中的实战应用:以IAttackable构建可扩展战斗系统

1. 项目概述:为什么接口是C#游戏开发的“王者”之路 在Unity游戏开发的世界里,我们常常会听到一个词:“耦合”。想象一下,你正在开发一个角色系统,里面有战士、法师、弓箭手。每个角色都有攻击行为,最直接的…

2026/7/24 12:36:04 阅读更多 →
基于Springboot3+Vue3的乡村特色农产品销售管理系统(AI智能客服、支付宝沙盒支付、协同过滤算法、快递物流API、Echarts图形化分析、websocket实时聊天)

基于Springboot3+Vue3的乡村特色农产品销售管理系统(AI智能客服、支付宝沙盒支付、协同过滤算法、快递物流API、Echarts图形化分析、websocket实时聊天)

🎈系统亮点: AI智能客服、支付宝沙盒支付、协同过滤算法、快递物流API、Echarts图形化分析、websocket实时聊天 ;一.系统开发工具与环境搭建1.系统设计开发工具后端使用Java编程语言的Spring boot框架 项目架构:B/S架构 运行环境&…

2026/7/25 12:46:48 阅读更多 →

最新新闻

UE5蓝图触发器实战:从盒体触发器到可复用游戏逻辑组件

UE5蓝图触发器实战:从盒体触发器到可复用游戏逻辑组件

1. 项目概述:从“出发区域”切入UE5蓝图逻辑构建最近在跟着张亮002老师的UE5教程学习,正好做到了第1-6讲,主题是“出发区域”。这讲内容看似基础,就是一个玩家走进特定区域触发事件的逻辑,但恰恰是这种最基础的交互&am…

2026/7/26 16:44:53 阅读更多 →
SVM在风力发电故障检测中的工程实践

SVM在风力发电故障检测中的工程实践

1. 项目背景与核心价值风力发电作为清洁能源的重要组成部分,其设备可靠性直接关系到电网稳定和发电效率。风力涡轮机长期在恶劣环境中运行,齿轮箱、轴承和发电机等关键部件容易出现磨损、裂纹或电气故障。传统定期维护方式存在滞后性,而基于支…

2026/7/26 16:44:53 阅读更多 →
SSSD部署最佳实践:从源码编译到生产环境配置全流程

SSSD部署最佳实践:从源码编译到生产环境配置全流程

SSSD部署最佳实践:从源码编译到生产环境配置全流程 【免费下载链接】sssd A daemon to manage identity, authentication and authorization for centrally-managed systems. 项目地址: https://gitcode.com/gh_mirrors/ss/sssd SSSD(System Secu…

2026/7/26 16:44:53 阅读更多 →
Windows安卓应用安装器:3分钟在电脑上运行安卓应用的终极方案

Windows安卓应用安装器:3分钟在电脑上运行安卓应用的终极方案

Windows安卓应用安装器:3分钟在电脑上运行安卓应用的终极方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上运行安卓应用&am…

2026/7/26 16:44:53 阅读更多 →
如何在浏览器中零门槛体验完整的三国杀游戏?

如何在浏览器中零门槛体验完整的三国杀游戏?

如何在浏览器中零门槛体验完整的三国杀游戏? 【免费下载链接】noname 项目地址: https://gitcode.com/GitHub_Trending/no/noname 你是否曾想过,在浏览器中就能直接体验完整的三国杀游戏,无需安装任何客户端,不占用硬盘空…

2026/7/26 16:44:53 阅读更多 →
嵌入式调试器配置文件转换与错误信息深度解析

嵌入式调试器配置文件转换与错误信息深度解析

1. 项目概述:嵌入式调试器的“翻译官”与“诊断手册” 在嵌入式开发的战场上,调试器就是我们的“听诊器”和“手术刀”。它一头连着你的开发环境(IDE),另一头则通过JTAG、SWD等物理接口,直接“触摸”到目标…

2026/7/26 16:43:53 阅读更多 →

日新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻