真实面经题目 · 原创解析
Redis 持久化机制有哪些?
这题考察 RDB、AOF、混合持久化的恢复链路和可靠性取舍,还要区分持久化、复制和高可用解决的问题不同。
真实面经题目 · 原创解析
这题考察 RDB、AOF、混合持久化的恢复链路和可靠性取舍,还要区分持久化、复制和高可用解决的问题不同。
Redis 持久化主要有 RDB 快照和 AOF 追加日志。RDB 通过 `BGSAVE` fork 子进程生成某一时刻的数据快照,恢复快、适合备份,但两次快照之间的数据可能丢失,并有 fork 和 COW 内存压力。AOF 记录写命令,按 `always`、`everysec`、`no` 策略刷盘,数据更完整但文件更大,恢复要回放命令,并需要 AOF rewrite 压缩。生产常用混合持久化,让 AOF 文件前半是 RDB 快照、后半是增量命令,兼顾恢复速度和丢失窗口。
`SAVE` 阻塞主线程,`BGSAVE` fork 子进程写快照。它适合冷备、全量恢复和快速加载,但如果 Redis 崩溃,最近一次快照之后的写入会丢失。
大实例 fork 会消耗时间和内存页表;生成快照期间主进程继续写入会触发写时复制,内存可能出现尖刺,延迟也可能抖动。
AOF 追加每条写命令,`always` 最可靠但慢,`everysec` 常用但最多可能丢约一秒,`no` 依赖 OS 刷盘。恢复时按日志重放得到数据。
长期追加会有大量过期和覆盖命令,`BGREWRITEAOF` 会生成等价的紧凑命令集合。rewrite 期间新增写入要同时进入缓冲,最后合并,避免丢增量。
混合持久化提升单机重启恢复速度和完整性;主从复制、Sentinel、Cluster 解决服务可用性。复制也是异步为主,不能把它当成零丢失保证。
会,通常可能丢最近一秒左右的写入。它是在性能和可靠性之间的常见折中,不是强持久化。
大实例 fork 可能带来延迟抖动和内存压力;快照期间写入越多,COW 额外内存越明显。
rewrite 本身由子进程完成,但 fork、缓冲合并和磁盘 IO 仍可能影响主线程延迟,需要监控和错峰。
不能。持久化解决重启恢复和数据丢失窗口,高可用解决节点故障后的服务连续性,两者要配合。