Sunday 的面试指南

Redis 的 RDB 和 AOF 有什么区别?宕机后哪些数据可能丢失?

🧑‍💻 面试官:Redis 开了持久化,收到 OK 的写入就一定不会丢吗?

🙋‍♂️ 我:还要看持久化方式和落盘策略,回复成功不一定表示已经同步到磁盘。

🧑‍💻 面试官:RDB 和 AOF,分别保存的是什么?

🙋‍♂️ 我:RDB 保存某个时点的数据快照,AOF 记录用于恢复数据的写入操作。

🧑‍💻 面试官:AOF 每秒同步一次,就能承诺任何故障都最多丢一秒吗?如果磁盘根本不可用呢?

先顺着「执行、写入缓冲、同步落盘」看数据到了哪里,再判断某种故障下能恢复多少。

面试速答(60 秒版)

RDB 保存某个时点的数据快照,文件较紧凑,恢复时直接加载快照,但快照完成以后发生的写入,单靠这份 RDB 无法找回。

AOF 记录用于重建数据的写入操作。数据能保留到什么程度,还取决于同步策略:每次同步更强调持久性,每秒同步在常见故障下可能损失最近约一秒,交给操作系统同步则没有同样的时间承诺。

但这些都依赖磁盘、系统与错误处理正常,不能把配置名称当成任何故障下的绝对保证。现代 Redis 的 AOF 还可能包含基础文件和增量文件,重写也不等于把所有历史命令永久保存。

实际选择要先明确允许丢多少、恢复多久,并做真实恢复测试。持久化也不等于备份,误删数据后被正常记录,仍需要独立备份找回。

快照时点与日志同步恢复窗口

这里假设故障发生在后两次写入尚未同步时,用来对比恢复范围;时间刻度不代表实际 fsync 周期。

知识点详解:收到写入成功以后,数据还有哪几步?

RDB 留下的是一个时点

假设 Redis 在 10:00 完成了一份快照,之后写入了一批新订单状态,10:03 机器故障。

如果只能加载 10:00 的 RDB,就只能恢复这份快照包含的数据。后面的写入并不会因为客户端收到过 OK,就自动出现在文件里。

后台生成 RDB 通常会涉及子进程和写时复制。它减少了长时间阻塞主进程的需要,但 fork、页表和写入期间的内存复制仍可能带来资源压力。不能说后台保存完全没有性能影响。

具体可恢复的时点,取决于成功生成并保存了哪份文件,而不是配置写着每隔多久尝试一次。

AOF 为什么还要讨论 fsync?

数据修改以后,AOF 内容可能先进入程序或操作系统缓冲,再由同步操作推进到持久存储。

写入文件成功和已经可靠同步到磁盘,是不同阶段。进程崩溃、操作系统崩溃和机器断电,也不是完全相同的故障。

appendfsync always 更积极地同步写入,通常付出更高写入成本;everysec 通常由后台周期同步;no 则依赖操作系统安排。应用收到回复时的数据位置,需要结合实际同步策略理解。Redis 持久化官方说明介绍了这些选项。

“每秒同步可能丢约一秒”是常见健康运行条件下的说明,不能承诺磁盘损坏、I/O 长时间卡住或持久化错误时也一定满足这个窗口。

程序缓冲、OS缓存、同步存储位置

AOF 重写是不是把日志清空?

不是。长时间记录会使恢复文件变大,因此重写根据当前状态生成更紧凑的恢复表示,同时处理重写期间的新写入。

例如,一个 key 被修改很多次,恢复当前状态并不需要重放全部历史变化。重写后的内容可以只保留重建当前数据所需的操作。

现代 Redis 的多部分 AOF 可以使用基础文件、增量文件及清单,基础部分也可能采用 RDB 格式。它不是一份永远只追加、永远包含全部操作历史的审计账本。

因此,备份时需要取得完整且一致的恢复文件集合,不能随手复制一个看起来最新的文件就结束。

重写后的基础与增量文件

两种方式一起开,就一定不会丢数据吗?

也不能这样保证。RDB 与 AOF 可以提供不同的恢复与运维选择,但它们仍共享一些故障风险,例如同一磁盘损坏。

复制同样不能替代持久化和备份。副本可能还没收到最新写入,误删除也可能被复制过去。

选择时先确定恢复点目标,也就是允许失去多新的数据;再确定恢复时间目标,也就是恢复到可服务状态允许多久。这两个要求会影响同步策略、备份和部署方式。

面试官继续追问

开了 AOF,就不用 RDB 了吗?

不一定。RDB 便于保存某个时点的副本,适合备份与迁移等场景;AOF 提供另一种写入恢复方式。

是否同时启用,要结合资源与恢复需求。不能为了功能全开而忽略重写、快照和备份同时运行的峰值开销。

缓存数据都可以从数据库重建,还需要持久化吗?

可以不采用同样的持久化要求,但要考虑重启后的回源压力和重建时间。

如果 Redis 保存的是无法从其他地方重建的业务状态,要求就不同。先分清哪些是缓存、哪些是权威数据,不能对所有 key 使用同一句建议。

怎样做一次有效的恢复演练?

在隔离测试环境使用可核对的写入序列,测试相应故障和恢复方式,确认恢复到了哪个编号、花了多久。

还要检查文件集合、权限、容量和备份可用性。只确认 Redis 重启成功,不代表数据完整,更不代表备份真的能恢复。

面试速记卡

  • RDB:保存成功快照中的状态,之后的写入不在这份文件中。
  • AOF:保存恢复操作,持久性依赖写入与同步策略。
  • everysec:常见故障下可能丢最近约一秒,不是无条件承诺。
  • 重写:压缩恢复表示,不保留完整历史审计。
  • 运维判断:持久化、复制、备份和恢复演练分别负责不同问题。
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历