三个交互演示:① fork + COW 写时复制 · ② AOF 三档刷盘策略对比 · ③ AOF 重写过程(双缓冲)
左边是父进程(继续接收客户端写命令),右边是子进程(遍历内存写 RDB 文件)。点「下一步」单步看 6 阶段,或者点「父进程修改第 N 页」观察 COW 触发:
客户端持续下发 SET 写命令。每条命令都会经过① 主线程内存 → ② OS page cache → ③ 物理磁盘三段。 三档策略在「什么时候 fsync」上有差异,断电时丢的就是「停在 page cache 里那部分」。
左侧是原始 AOF(很多对同一 key 的反复 SET / INCR / LPUSH / DEL); 点「触发重写」后右侧子进程基于当前内存状态生成最精简命令; 重写期间主进程的新写入会同时进入两个缓冲区,结束时合并到新 AOF。
子进程开始重写后,主进程接收的新命令会同时写入两个缓冲区——左边保证旧 AOF 仍可用,右边等子进程结束后追加到新 AOF 末尾:
rename(临时, appendonly.aof) 原子替换。