学完这篇你能得到一份可以直接照抄的 Redis 持久化配置方案:知道 RDB、AOF、混合持久化各自在什么场景下用,怎么改配置、怎么验证生效、怎么在线切换,以及哪些参数调错会出问题。
第一步:先分清三者到底在干什么
- RDB:按时间间隔把内存数据生成一个二进制快照文件(默认
dump.rdb)。文件紧凑、恢复快,但两次快照之间的数据会丢。
- AOF:把每条写命令追加到日志文件,重启时重放。丢数据少(最多丢 1 秒),但文件大、恢复慢。
- 混合持久化:Redis 4.0 起支持。AOF 重写时,前半段用 RDB 格式存当前数据快照,后半段继续追加增量命令。恢复时先加载 RDB 部分再重放增量,兼顾了速度和安全性。
先确认你的版本,4.0 以下没有混合模式:
redis-server -v
redis-cli INFO server | grep redis_version
第二步:配置 RDB
打开 redis.conf,找到快照规则:
save 900 1 # 900 秒内至少 1 次写
save 300 10 # 300 秒内至少 10 次写
save 60 10000 # 60 秒内至少 10000 次写
dbfilename dump.rdb
dir /var/lib/redis
stop-writes-on-bgsave-error yes
rdbcompression yes
想彻底关掉 RDB,写 save ""(空字符串),不是注释掉——注释掉等于用默认规则。
注意:dir 是 RDB 和 AOF 共用的工作目录,必须存在且 redis 用户可写。另外每次 BGSAVE 会 fork 子进程,靠 copy-on-write 省内存;如果写入很猛,实际内存可能涨到 1.5~2 倍,maxmemory 要留出余量,否则会 OOM 或被 OOM Killer 干掉。
手动触发一次快照并确认:
redis-cli BGSAVE
redis-cli INFO persistence | grep rdb_last_bgsave_status
第三步:配置 AOF
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
appendfsync 三选一,这是最关键的取舍:
| 取值 | 丢数据 | 性能 |
|---|
| always | 几乎不丢 | 最差,每条命令都 fsync |
| everysec | 最多 1 秒 | 推荐,默认 |
| no | 交给操作系统 | 最快,可能丢几十秒 |
注意:Redis 7.0 起 AOF 改成多文件,放在 appenddirname "appendonlydir" 目录里,有一个 .manifest 清单文件。备份时不能只拷单个 .aof,要整个目录一起拷,否则恢复失败。
第四步:开启混合持久化
只需要加一行(Redis 5.0 起默认就是 yes):
aof-use-rdb-preamble yes
前提是 appendonly yes,AOF 关着这行没意义。
注意:混合模式生成的文件不能直接当 RDB 用,也不适合给老版本 Redis(< 4.0)读取,降级前先 BGREWRITEAOF 或在低版本上重建。
第五步:验证与在线调整
不用重启就能改的参数,用 CONFIG SET:
redis-cli CONFIG SET appendfsync everysec
redis-cli CONFIG SET auto-aof-rewrite-percentage 100
redis-cli CONFIG REWRITE # 把改动写回 redis.conf,否则重启丢失
redis-cli INFO persistence # 看 aof_enabled / aof_last_bgrewrite_status
redis-cli BGREWRITEAOF # 手动重写压缩 AOF
运行时从 RDB 切到 AOF:
redis-cli CONFIG SET appendonly yes
这条命令会自动触发一次 AOF 重写,把当前内存写成初始 AOF。切换后务必执行 CONFIG REWRITE,并在业务低峰做,重写期间 fork 会短暂卡顿。
注意:不要在生产上反复来回切持久化方式。切换过程有 fork 开销和磁盘 IO 峰值,容易顶到 CPU 打满。
第六步:按场景选
- 纯缓存,丢了能回源:可以关掉持久化,或者只留 RDB 低频快照。
- 允许丢几分钟数据,追求恢复速度:RDB 就够,重启加载快。
- 订单、余额、会话这类不能丢:AOF +
everysec,或直接上混合持久化。
- 数据量大又要求快速恢复:混合持久化,这就是它的设计目的。
小结
- RDB 快但会丢窗口数据,AOF 稳但文件大恢复慢,混合持久化是默认推荐。
appendfsync everysec 是绝大多数业务的正确选择,别为了"绝对不丢"上 always。
- RDB 关闭用
save "",不是删掉 save 行。
CONFIG SET 改完必须 CONFIG REWRITE,否则重启回到旧配置。
- Redis 7.0 的 AOF 是多文件目录,备份要整目录拷。
- fork + copy-on-write 会放大内存,
maxmemory 一定要留余量。