持久化
Redis 是内存库,持久化决定宕机后丢多少数据。三种方案:RDB(快照)、AOF(追加日志)、混合(4.0+,默认推荐)。面试主线:各方案原理、丢数据窗口、怎么选。
RDB:全量快照
RDB:bgsave 子进程快照
save(阻塞)和bgsave(fork 子进程,不阻塞)两种触发- COW(写时复制):fork 后父子共享内存页,主进程修改的页才复制,子进程拿到的是 fork 时刻的完整快照
- 自动触发:
save 900 1等配置(900 秒内 1 次写) - 优点:文件紧凑、加载快、适合备份
- 缺点:快照间隔内的数据全丢(低频写入时最多丢 15 分钟,高频写入 60 秒即触发)
AOF:追加日志
- 每(或每批)写命令追加到 AOF 文件,重启时重放恢复
- fsync 策略决定丢多少:
| 策略 | 行为 | 丢数据 |
|---|---|---|
| always | 每条命令 fsync | 最多一条 |
| everysec(默认) | 每秒 fsync | 最多 1 秒 |
| no | 交给操作系统 | 不确定 |
- AOF 重写:日志无限增长,重写(fork 子进程)生成当前数据集的紧凑命令集,替换旧文件。同样用 COW
- 优点:丢数据少;缺点:文件大、加载慢(混合持久化解决)
混合持久化
4.0+ 的 aof-use-rdb-preamble(默认开启):
- AOF 文件头部是 RDB 快照,尾部追加增量命令
- 加载时 RDB 部分秒级加载,增量部分补上重启前的写入
- 兼顾 RDB 的加载速度和 AOF 的低丢失,生产默认选择
选型与工程要点
| 方案 | 丢数据 | 加载速度 | 适用 |
|---|---|---|---|
| RDB | 大(分钟级) | 快 | 缓存可丢、备份场景 |
| AOF | 小(秒级) | 慢 | 数据敏感 |
| 混合 | 小 | 快 | 生产默认 |
工程要点:主从架构下从库可承担持久化;bgsave 和 AOF 重写都 fork,内存占用翻倍风险,maxmemory 要留余量;大实例 fork 有阻塞风险(Linux 大页关闭等调优)。
面试追问
- RDB 和 AOF 的区别? 快照 vs 日志。RDB 丢数据窗口大但加载快,AOF 反之。混合两者都要
- bgsave 为什么能边写边服务? fork 子进程 + COW。子进程读共享页写快照,主进程改的页才复制
- AOF 重写是什么? 日志无限增长,重写生成当前数据集的最小命令集替换旧文件,同样 fork
- everysec 会丢多少? 最多 1 秒的写命令。always 每条都 fsync 但性能差,生产多用 everysec
- 主从下持久化还要开吗? 从库开即可,但主库关 AOF 时主从切换后可能丢数据,谨慎权衡