大家好,我是程序员二叉。


简介

Redis基于内存运行,宕机后内存数据全部丢失,持久化是保障数据落地磁盘的核心机制。本文全面梳理RDB快照、AOF日志、AOF重写、混合持久化底层原理、优缺点与适用场景,附带宕机完整恢复流程,覆盖面试高频考点与线上落地规范。欢迎点赞收藏关注。


一、RDB持久化

1. 定义

RDB是Redis默认持久化方案,某一时间点全量内存二进制快照,落地为rdb文件。

2. 原理

主线程fork子进程,依托COW写时复制;子进程遍历全量内存生成二进制快照,新文件生成后替换旧RDB,子进程操作不阻塞主线程。

3. 触发方式

  1. 手动:save(阻塞主线程)、bgsave(后台异步)
  2. 自动:save配置规则、shutdown关机、flushall、主从全量同步

4. 优点

  1. 二进制压缩存储,文件体积小,故障恢复速度极快
  2. 子进程异步落地,主线程性能损耗低
  3. 适合冷备份、跨机器容灾备份

5. 缺点

  1. 两次快照间隔宕机,中间新增数据全部丢失
  2. fork子进程瞬间占用双倍物理内存,大内存实例易卡顿

二、AOF持久化

1. 定义

以追加日志形式记录所有客户端写指令,重启通过重放指令恢复数据。

2. 三种刷盘策略

  • always:每条写命令立刻刷磁盘,零丢数据,性能最差
  • everysec:每秒统一刷盘,默认配置,最多丢失1s数据,均衡性能与安全
  • no:交给操作系统自主刷盘,性能最优,丢失数据不可控

3. AOF重写原理

fork子进程,直接读取当前内存数据,合并冗余指令生成最简新AOF;重写期间新增写命令存入aof重写缓冲区,重写结束后追加至新文件,原子替换旧AOF。

4. 重写目的

  1. 消除冗余指令(多次修改同一个key、del无效数据),缩减文件体积
  2. 减少重启重放指令数量,加快数据恢复速度

三、RDB与AOF对比

对比项 RDB AOF
存储格式 二进制快照 文本指令日志
数据丢失 间隔内全丢 everysec仅丢1秒
文件大小 偏大
恢复效率 极快 偏慢
适用场景 周期性冷备份 线上实时数据持久化

四、混合持久化(Redis4.0+)

原理

开启aof-use-rdb-preamble,AOF文件头部为RDB全量快照,尾部是增量AOF日志

优势

兼具RDB恢复快、AOF数据安全的优点,生产环境主流配置。


五、Redis宕机数据恢复流程

  1. Redis启动优先检查AOF文件是否开启
  2. 开启AOF:
    • 混合持久化:先加载头部RDB快照,再顺序重放尾部增量AOF日志
    • 纯AOF:从头到尾重放全部写命令
  3. 未开启AOF:直接加载本地最新RDB文件恢复数据
  4. 数据加载完毕,启动成功对外提供服务

总结

  1. RDB:全量快照,适合定期备份,存在丢数风险;
  2. AOF:日志追加,数据安全性高,everysec是最优刷盘配置,依靠重写压缩日志;
  3. 混合持久化融合两者优点,线上推荐开启;
  4. 重启恢复优先级:混合AOF > 纯AOF > RDB。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐