Redis 持久化中 最核心的原理之一:AOF 的“刷盘机制”
这已经进入 Redis 持久化中 最核心的原理之一:AOF 的“刷盘机制”(也就是日志如何从内存同步到硬盘)了!
✅ 什么是 AOF 的“刷盘”?
所谓 刷盘(fsync),就是:
Redis 把写命令记录到了日志里(AOF 缓冲区)后,把这个日志同步写入到硬盘,以免机器断电时数据丢失。
🧠 为什么要“刷盘”?
因为磁盘是慢设备,Redis 为了性能,不会每次写命令就立即写入硬盘,而是:
-
先把写操作追加到 AOF 内存缓冲区(cache)
-
再根据配置决定什么时候“刷盘”(flush 到 disk)
如果不刷盘,只存在内存里,Redis 崩了、系统断电,数据就全没了。
✅ AOF 的刷盘策略有三种(非常重要!)
在 redis.conf 中配置:
appendfsync always
appendfsync everysec
appendfsync no
|
策略 |
描述 |
安全性 |
性能 |
|---|---|---|---|
|
always |
每一条写操作都立即刷盘(同步写到硬盘) |
最安全 ✅ |
最差 ❌(慢) |
|
everysec |
每秒刷一次(默认) —— 1秒数据可能丢失 |
高 ✅ |
高 ✅ |
|
no |
让操作系统自己决定什么时候写(可能好几秒才刷) |
最差 ❌ |
最快 ✅ |
✅ 整个过程示意:
比如你执行一条命令:
SET user Tom
在 AOF 模式下发生的流程是:
1. Redis 处理这条命令(写入内存)
2. 把 "SET user Tom" 写到 AOF 缓冲区(内存)
3. 根据策略决定何时 fsync 写入硬盘
- always:马上刷盘 ✅
- everysec:等 1 秒一起刷 ✅
- no:由系统决定,时间不确定 ❌
所以,“刷盘”其实就是:
把写命令从内存日志 → 刷写到磁盘文件 appendonly.aof 的过程
🔥 面试角度这么说会更加出彩:
Redis 使用 AOF 持久化时,所有写操作都会被追加写入 AOF 缓冲区,然后由 appendfsync 参数控制刷盘时机。刷盘就是将命令从内存同步到硬盘,确保 Redis 崩溃时仍能通过 AOF 文件恢复数据。
🧠 Bonus 知识点(加分项)
-
Redis 使用 write() 写入缓冲区,再调用 fsync() 或 fdatasync() 刷盘
-
Redis 主线程处理写请求,AOF 写入 & 刷盘是同步完成的
-
Redis 4.0 后可以结合 RDB 和 AOF 混合持久化(提升启动速度 + 数据安全)
✅ 总结一句话:
Redis AOF 的“刷盘”就是:
将内存中的写命令日志,同步写入磁盘,以防 Redis 崩溃或断电时数据丢失。
是否立即刷盘,由 appendfsync 参数控制,是性能与安全的权衡点!
如果你想看我模拟一次 Redis 设置不同刷盘策略下的性能差异、故障恢复差异,我可以给你一个实验脚本演示,要不要?😎
浙公网安备 33010602011771号