本文是大数据系列第 45 篇,深入讲解 Redis 的两种持久化机制——RDB 快照与 AOF 日志,帮助在实际场景中做出合理选择。

完整图文版(含截图):CSDN 原文 | 掘金

为什么需要持久化

Redis 是内存数据库,进程重启或服务器宕机后内存数据全部丢失。持久化机制将内存数据写入磁盘,在 Redis 重启时重新加载,保障数据不丢失。


RDB(Redis Database)快照

RDB 将某一时刻的内存数据以二进制快照形式写入磁盘(默认文件名 dump.rdb)。

触发方式

自动触发redis.conf 配置):

# 格式:save <seconds> <changes>
save 900 1       # 900 秒内有 ≥1 个 key 变更则触发
save 300 10      # 300 秒内有 ≥10 个 key 变更则触发
save 60 10000    # 60 秒内有 ≥10000 个 key 变更则触发

手动触发

SAVE      # 同步执行,阻塞所有客户端(不推荐生产使用)
BGSAVE    # 后台 fork 子进程执行,主进程继续响应请求

工作原理

BGSAVE 使用 Copy-on-Write(COW) 机制:

  1. 主进程 fork 出子进程(内存页共享,开销极小)
  2. 子进程将内存数据写入临时 RDB 文件
  3. 写完后原子替换旧 RDB 文件
  4. 主进程修改数据时才复制对应内存页,不影响子进程快照

优缺点

优势

  • 恢复速度快(1GB 数据约 3 秒)
  • 文件紧凑(约为内存数据的 1/5 到 1/10)
  • 对主进程性能影响极小

劣势

  • 两次快照之间的数据存在丢失风险
  • 大数据集 fork 时可能产生短暂停顿(毫秒级)

AOF(Append Only File)日志

AOF 以文本格式追加记录每一条写命令(默认文件名 appendonly.aof)。

启用配置

appendonly yes

刷盘策略(appendfsync)

策略行为数据安全性性能
always每次写命令后立即 fsync最高(几乎不丢数据)最低
everysec每秒 fsync 一次(默认)高(最多丢 1 秒数据)较好
no由操作系统决定 fsync 时机最低最高

生产推荐everysec,在安全性与性能之间取得平衡。

appendfsync everysec

AOF 重写机制

AOF 文件会随时间增大,Redis 通过**重写(Rewrite)**压缩文件:将多条冗余命令合并为等效的最简形式。例如对同一个 key 的 100 次 SET 合并为最终的 1 次 SET。

# 手动触发重写
BGREWRITEAOF

# 自动重写配置
auto-aof-rewrite-percentage 100   # AOF 文件比上次重写后增长 100% 时触发
auto-aof-rewrite-min-size 64mb    # AOF 文件大于 64MB 才允许自动重写

重写同样使用 fork + COW,不阻塞主进程。


RDB vs AOF 对比

维度RDBAOF
数据安全性较低(可能丢失几分钟数据)较高(最多丢 1 秒)
恢复速度快(~3s / 1GB)慢(~30s / 1GB)
文件大小小(二进制压缩)大(文本记录所有命令)
持续 I/O 开销低(仅快照时)中(持续追加写)
文件可读性不可读(二进制)可读(文本命令)
适合场景快速恢复、可容忍少量数据丢失金融交易、零容忍数据丢失

混合持久化(Redis 4.0+)

Redis 4.0 引入混合持久化模式,结合 RDB 和 AOF 的优点:

aof-use-rdb-preamble yes

工作方式:AOF 重写时,先将当前内存状态以 RDB 格式写入 AOF 文件头部,后续新增命令仍以 AOF 格式追加。重启时先加载 RDB 部分(快速),再回放 AOF 增量部分(安全)。


生产环境建议

同时开启 RDB + AOF是主流做法:

# RDB:提供定期全量备份
save 900 1
save 300 10
save 60 10000

# AOF:保障实时数据安全
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# Redis 4.0+ 混合模式
aof-use-rdb-preamble yes

Redis 重启时优先加载 AOF 文件(安全性更高),仅当 AOF 不存在时才加载 RDB 文件。

场景决策

  • 缓存场景(允许冷启动):可关闭 AOF,仅保留 RDB 减少 I/O 开销
  • 会话存储 / 计数器everysec AOF 足够
  • 金融 / 支付流水always AOF + 定期 RDB 备份 + 主从复制三重保障