Redis持久化:RDB与AOF
约 1870 字大约 6 分钟
redispersistence
2025-05-08
Redis 作为内存数据库,持久化机制是保证数据安全的关键。Redis 提供两种持久化方式:RDB(快照)和 AOF(追加日志),以及两者的混合模式。
持久化方式概览
RDB 持久化
工作原理
RDB 将某个时间点的全部数据生成快照文件(dump.rdb)。
触发方式
# 手动触发
SAVE # 同步保存,阻塞主进程(生产环境勿用)
BGSAVE # 后台异步保存
# 自动触发配置
# save <seconds> <changes>
save 3600 1 # 3600 秒内至少 1 次修改
save 300 100 # 300 秒内至少 100 次修改
save 60 10000 # 60 秒内至少 10000 次修改
# 关闭 RDB 自动保存
save ""
# RDB 文件名和路径
dbfilename dump.rdb
dir /var/lib/redis
# RDB 压缩(默认开启,使用 LZF 压缩)
rdbcompression yes
# RDB 校验和
rdbchecksum yesfork 与 COW
注意事项:
- fork 瞬间会阻塞主进程,大数据量实例可能卡顿几百毫秒到几秒
- COW 导致写操作期间内存可能翻倍
- 建议预留
maxmemory一倍的物理内存给 COW
RDB 的优缺点
| 优点 | 缺点 |
|---|---|
| 文件紧凑,适合备份和传输 | 两次快照之间的数据可能丢失 |
| 恢复速度快 | fork 可能导致瞬间卡顿 |
| 子进程不影响主进程性能 | 大数据集 fork 耗时长 |
AOF 持久化
工作原理
AOF 记录每条写入命令,以 RESP 协议格式追加到文件末尾。
fsync 策略
# always: 每条命令都 fsync(最安全,最慢)
appendfsync always
# everysec: 每秒 fsync 一次(推荐,最多丢 1 秒数据)
appendfsync everysec
# no: 由 OS 决定何时 fsync(最快,不可控)
appendfsync noAOF 配置
# 启用 AOF
appendonly yes
# AOF 文件名
appendfilename "appendonly.aof"
# Redis 7.0+ AOF 使用多文件(Multi Part AOF)
# 目录下会有 base.rdb + incr.aof 文件
appenddirname "appendonlydir"AOF 重写 (Rewrite)
AOF 文件会持续增长,重写机制通过读取当前内存数据生成最小化的命令集来压缩 AOF 文件。
# 手动触发重写
BGREWRITEAOF
# 自动触发条件
auto-aof-rewrite-percentage 100 # AOF 文件比上次重写后增长 100%
auto-aof-rewrite-min-size 64mb # AOF 文件最小 64MB 才触发重写示例:
# 重写前的 AOF(冗余命令)
SET name "Alice"
SET name "Bob"
SET name "Charlie"
INCR counter
INCR counter
INCR counter
# 重写后的 AOF(最小化)
SET name "Charlie"
SET counter "3"RDB + AOF 混合持久化
Redis 4.0 引入混合持久化,在 AOF 重写时将 RDB 数据写入 AOF 文件头部,后续增量命令以 AOF 格式追加。
# 启用混合持久化(默认开启)
aof-use-rdb-preamble yes优势:
- 恢复速度接近纯 RDB(头部 RDB 快速加载)
- 数据完整性接近纯 AOF(尾部 AOF 补充增量)
持久化对比表
| 维度 | RDB | AOF | 混合 |
|---|---|---|---|
| 数据安全 | 可能丢失分钟级数据 | 最多丢失 1 秒 | 最多丢失 1 秒 |
| 文件大小 | 紧凑(二进制) | 较大(文本) | 适中 |
| 恢复速度 | 快 | 慢(逐条重放) | 快 |
| fork 频率 | 按配置触发 | 重写时 fork | 重写时 fork |
| 写入性能影响 | 仅 fork 时 | 持续(fsync) | 持续(fsync) |
| 文件可读性 | 二进制 | 可读文本 | 混合 |
恢复优先级
AOF 优先于 RDB:当两者同时存在时,Redis 优先使用 AOF 恢复,因为 AOF 通常数据更完整。
生产环境建议
推荐配置
# 开启 AOF(混合模式)
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
# AOF 重写阈值
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 同时保留 RDB(用于备份)
save 3600 1
save 300 100
# 关闭 RDB 持久化时 fork 错误导致拒绝写入
stop-writes-on-bgsave-error yes
# AOF 加载时遇到截断继续
aof-load-truncated yes备份策略
# 定时备份 RDB 文件
0 */4 * * * cp /var/lib/redis/dump.rdb /backup/redis/dump_$(date +\%Y\%m\%d_\%H).rdb
# AOF 文件修复(文件损坏时使用)
redis-check-aof --fix appendonly.aof
# RDB 文件检查
redis-check-rdb dump.rdb无持久化场景
# 纯缓存场景可关闭持久化
save ""
appendonly no常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| BGSAVE fork 卡顿 | 内存大,页表大 | 使用大页(THP 关闭),控制数据量 |
| AOF 文件过大 | 写入频繁,重写不及时 | 降低重写阈值,增大 IO 带宽 |
| 恢复时间过长 | AOF 文件大 | 使用混合持久化 |
| COW 导致 OOM | 写操作频繁,COW 复制过多页 | 预留足够内存,减少 fork 期间写入 |
总结
- RDB:适合备份和灾难恢复,恢复速度快但可能丢失数据
- AOF:数据更安全,配合
everysec策略最多丢失 1 秒数据 - 混合持久化:推荐的生产方案,兼顾恢复速度和数据安全
- fork + COW 是两种持久化共同面临的性能挑战
- 无论选择哪种方式,定期备份 RDB 文件到远程存储是必要的
贡献者
更新日志
2026/3/14 13:09
查看所有更新日志
9f6c2-feat: organize wiki content and refresh site setup于