少女祈祷中...
NEKO
知识库

redis 持久化面试要点

一、总览类

Q1:Redis 有哪几种持久化方式?

  • RDB:快照,二进制存某个时间点的全量数据。

  • AOF:追加日志,记录每条写命令。

  • 混合持久化:RDB 全量 + AOF 增量,Redis 4.0+。

  • 无持久化:纯缓存场景可关闭。

Q2:RDB 和 AOF 的区别?

维度

RDB

AOF

内容

全量数据快照

写命令日志

文件

二进制,小

文本,大

恢复

快

慢

实时性

差,可能丢数据

好,可每秒/每命令

性能

fork 时略卡

刷盘有开销

适用

备份、灾难恢复

高数据安全

Q3:怎么选择持久化方式?

  • 只做缓存:可关闭持久化。

  • 能容忍少量丢失:RDB。

  • 数据安全要求高:AOF 或混合持久化。

  • 生产推荐:混合持久化 + 合理刷盘策略。

二、RDB 类

Q4:RDB 是什么?

  • Redis DataBase,把内存数据以二进制快照写入 .rdb 文件。

  • 文件紧凑,恢复快。

  • 是某个时间点的全量数据。

Q5:RDB 的触发方式?

  • 手动:SAVE(阻塞)、BGSAVE(fork 子进程)。

  • 自动:配置 save <seconds> <changes>,如 save 900 1。

  • 其他:主从全量同步、SHUTDOWN、FLUSHALL 后。

Q6:SAVE 和 BGSAVE 的区别?

  • SAVE:主线程执行,阻塞所有请求。

  • BGSAVE:fork 子进程执行,主线程继续处理请求。

  • 生产用 BGSAVE。

Q7:BGSAVE 的原理?

  1. 主线程 fork 子进程。

  2. 子进程遍历内存,写入临时 RDB 文件。

  3. 写完替换旧文件。

  4. fork 用 COW(Copy-On-Write),主线程写时才复制页。

Q8:什么是 COW?

  • fork 后父子进程共享内存页,只读。

  • 主线程写某页时,才复制该页给子进程。

  • 减少 fork 时的内存复制。

  • 但写入多时,复制页多,内存可能翻倍。

Q9:fork 有什么代价?

  • fork 本身阻塞主线程,数据量大时明显。

  • COW 期间内存可能增长,甚至 OOM。

  • 子进程写 RDB 占用 CPU 和磁盘 IO。

  • 大实例建议控制 fork 频率。

Q10:RDB 的优缺点?

  • 优点:文件小、恢复快、适合备份。

  • 缺点:可能丢数据(两次快照之间)、fork 有开销、大实例卡顿。

三、AOF 类

Q11:AOF 是什么?

  • Append Only File,记录每条写命令。

  • 恢复时重放命令重建数据。

  • 默认关闭,appendonly yes 开启。

Q12:AOF 的写入流程?

  1. 命令写入 AOF 缓冲区(aof_buf)。

  2. 按刷盘策略写入 AOF 文件。

  3. 按策略 fsync 刷盘。

  4. AOF 重写压缩文件。

Q13:AOF 的刷盘策略?

策略

行为

安全性

性能

always

每个命令 fsync

不丢

最差

everysec

每秒 fsync

丢 1 秒

折中,默认

no

由 OS 决定

可能丢多

最好

  • 生产推荐 everysec,兼顾安全和性能。

Q14:AOF 重写是什么?为什么需要?

  • AOF 文件会越来越大,恢复慢。

  • 重写:根据当前数据生成最小命令集,替换旧 AOF。

  • 例:100 次 INCR 重写为一次 SET key 100。

  • 触发:BGREWRITEAOF 或配置 auto-aof-rewrite-percentage。

Q15:AOF 重写的原理?

  1. 主线程 fork 子进程。

  2. 子进程遍历内存,写新 AOF 文件。

  3. 主线程继续处理命令,同时写入 AOF 重写缓冲区。

  4. 子进程写完,主线程把重写缓冲区追加到新文件。

  5. 替换旧 AOF。

Q16:AOF 重写期间数据会丢吗?

  • 不会。重写缓冲区记录期间的写命令。

  • 重写完成后追加,保证不丢。

  • 但重写期间内存和 CPU 有开销。

Q17:AOF 的优缺点?

  • 优点:实时性好,可每秒刷,丢数据少。

  • 缺点:文件大、恢复慢、重写有开销。

四、混合持久化类

Q18:什么是混合持久化?

  • Redis 4.0+ 引入。

  • AOF 重写时,前半部分用 RDB 格式存全量,后半部分用 AOF 格式存增量。

  • 兼顾 RDB 恢复快和 AOF 丢数据少。

Q19:混合持久化怎么开启?

  • aof-use-rdb-preamble yes(默认 yes)。

  • 需先开启 AOF:appendonly yes。

Q20:混合持久化的恢复流程?

  1. 加载 RDB 部分,快速恢复大部分数据。

  2. 重放 AOF 部分,补齐增量。

  3. 恢复速度快于纯 AOF。

Q21:混合持久化的优缺点?

  • 优点:恢复快、丢数据少、文件相对小。

  • 缺点:AOF 文件可读性差(含二进制)、兼容性要求 4.0+。

五、数据恢复类

Q22:Redis 启动时怎么恢复数据?

  • 如果开启 AOF,优先加载 AOF。

  • 否则加载 RDB。

  • AOF 恢复慢但数据新;RDB 恢复快但可能旧。

Q23:RDB 和 AOF 同时存在,加载哪个?

  • 优先 AOF,因为 AOF 数据更完整。

  • 前提是 AOF 开启且文件存在。

  • Redis 4.0+ 混合持久化时,AOF 文件含 RDB 头。

Q24:AOF 文件损坏怎么办?

  • redis-check-aof --fix appendonly.aof 修复。

  • 会丢弃损坏部分之后的数据。

  • 修复后重启加载。

Q25:RDB 文件损坏怎么办?

  • redis-check-rdb dump.rdb 检查。

  • 损坏严重可能无法恢复。

  • 依赖备份。

六、性能与运维类

Q26:持久化对性能有什么影响?

  • BGSAVE fork 阻塞主线程,COW 增加内存。

  • AOF always 每次 fsync,性能差。

  • everysec 折中,最多丢 1 秒。

  • 重写期间 CPU、内存、磁盘压力大。

Q27:怎么优化持久化性能?

  • 用 everysec 而非 always。

  • 控制 fork 频率,避免频繁 BGSAVE。

  • 大实例用主从,从库持久化。

  • 用 SSD,提升磁盘 IO。

  • 合理设置 auto-aof-rewrite-percentage。

Q28:主从架构下持久化怎么配?

  • 主库可关闭持久化,提升性能。

  • 从库开启 AOF/RDB,保证数据安全。

  • 但主库关闭持久化有风险,重启可能丢数据。

  • 常见:主库 RDB + 从库 AOF。

Q29:appendfsync everysec 会丢多少数据?

  • 最多丢 1 秒的写命令。

  • 如果 fsync 时磁盘慢,可能更多。

  • 要求不丢用 always,但性能差。

Q30:BGSAVE 和 BGREWRITEAOF 能同时执行吗?

  • 不能同时执行,会排队。

  • 如果 BGSAVE 在执行,BGREWRITEAOF 会延迟。

  • 反之亦然。避免频繁触发。

七、高频陷阱题

Q31:RDB 一定丢数据吗?

  • 是。两次快照之间的写会丢。

  • 除非配合 AOF。

  • 所以 RDB 不适合高数据安全场景。

Q32:AOF 一定不丢吗?

  • 不一定。everysec 最多丢 1 秒。

  • always 理论上不丢,但性能差。

  • 还有磁盘故障等极端情况。

Q33:fork 会复制所有内存吗?

  • 不会。COW 只复制被修改的页。

  • 但写入多时,复制页多,内存可能接近翻倍。

  • 所以大实例要注意内存余量。

Q34:AOF 重写会阻塞吗?

  • fork 瞬间阻塞,之后子进程执行。

  • 主线程继续处理命令。

  • 但重写缓冲区追加时有短暂阻塞。

Q35:混合持久化还是纯 AOF 吗?

  • 是 AOF 的一种形式,文件仍是 AOF。

  • 只是内容前半是 RDB 格式。

  • 加载时按 AOF 流程,先读 RDB 头再重放。

Q36:Redis 能同时用 RDB 和 AOF 吗?

  • 能。两者可同时开启。

  • 恢复优先 AOF。

  • 生产常用混合持久化替代纯 AOF。

评论