Skip to content

持久化

RDB 快照、AOF 追加日志、混合持久化、怎么选。

Updated View as Markdown
For humans

持久化

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 大页关闭等调优)。

面试追问

  1. RDB 和 AOF 的区别? 快照 vs 日志。RDB 丢数据窗口大但加载快,AOF 反之。混合两者都要
  2. bgsave 为什么能边写边服务? fork 子进程 + COW。子进程读共享页写快照,主进程改的页才复制
  3. AOF 重写是什么? 日志无限增长,重写生成当前数据集的最小命令集替换旧文件,同样 fork
  4. everysec 会丢多少? 最多 1 秒的写命令。always 每条都 fsync 但性能差,生产多用 everysec
  5. 主从下持久化还要开吗? 从库开即可,但主库关 AOF 时主从切换后可能丢数据,谨慎权衡
Navigation

Type to search…

↑↓ navigate↵ selectEsc close