60 秒回答模板

Redis 持久化主要有 RDB 快照和 AOF 追加日志。RDB 通过 `BGSAVE` fork 子进程生成某一时刻的数据快照,恢复快、适合备份,但两次快照之间的数据可能丢失,并有 fork 和 COW 内存压力。AOF 记录写命令,按 `always`、`everysec`、`no` 策略刷盘,数据更完整但文件更大,恢复要回放命令,并需要 AOF rewrite 压缩。生产常用混合持久化,让 AOF 文件前半是 RDB 快照、后半是增量命令,兼顾恢复速度和丢失窗口。

考点 核心机制与工程取舍
难度 中高频面试题
回答目标 按定义、机制、场景讲清楚

深入解析

01

RDB 是时间点快照

`SAVE` 阻塞主线程,`BGSAVE` fork 子进程写快照。它适合冷备、全量恢复和快速加载,但如果 Redis 崩溃,最近一次快照之后的写入会丢失。

02

fork 和 COW 是 RDB 风险

大实例 fork 会消耗时间和内存页表;生成快照期间主进程继续写入会触发写时复制,内存可能出现尖刺,延迟也可能抖动。

03

AOF 是写命令日志

AOF 追加每条写命令,`always` 最可靠但慢,`everysec` 常用但最多可能丢约一秒,`no` 依赖 OS 刷盘。恢复时按日志重放得到数据。

04

AOF rewrite 解决文件膨胀

长期追加会有大量过期和覆盖命令,`BGREWRITEAOF` 会生成等价的紧凑命令集合。rewrite 期间新增写入要同时进入缓冲,最后合并,避免丢增量。

05

混合持久化和高可用要分开

混合持久化提升单机重启恢复速度和完整性;主从复制、Sentinel、Cluster 解决服务可用性。复制也是异步为主,不能把它当成零丢失保证。

易错点

  • 说 Redis 开了持久化就绝对不丢数据。
  • 只背 RDB/AOF 名字,不讲生成、刷盘和恢复路径。
  • 忽略大实例 fork、COW 和 rewrite 的延迟与内存成本。
  • 把持久化、复制、Sentinel/Cluster 的作用混为一谈。

面试官追问

AOF `everysec` 会丢数据吗?

会,通常可能丢最近一秒左右的写入。它是在性能和可靠性之间的常见折中,不是强持久化。

RDB fork 有什么线上风险?

大实例 fork 可能带来延迟抖动和内存压力;快照期间写入越多,COW 额外内存越明显。

AOF rewrite 会不会阻塞主线程?

rewrite 本身由子进程完成,但 fork、缓冲合并和磁盘 IO 仍可能影响主线程延迟,需要监控和错峰。

持久化能替代主从高可用吗?

不能。持久化解决重启恢复和数据丢失窗口,高可用解决节点故障后的服务连续性,两者要配合。