一、AOF持久化概述
1.1 什么是AOF?
AOF(Append Only File)是Redis的实时持久化 机制,通过记录所有写操作命令来实现数据持久化。
核心特点:
- 实时记录:每次写操作都立即记录
- 可读性强:文本格式存储,便于人工阅读
- 数据安全:丢失风险低于RDB
工作原理图:
客户端写命令 Redis主线程执行 写入AOF缓冲区 根据策略刷盘 AOF文件 重启时重新执行AOF文件中的命令 恢复数据
1.2 AOF与RDB关系
| 对比项 | AOF | RDB |
|---|---|---|
| 持久化方式 | 记录操作命令(日志) | 生成数据快照(快照) |
| 文件格式 | 文本 | 二进制 |
| 数据可靠性 | 高 | 中 |
| 恢复速度 | 慢 | 快 |
| 文件大小 | 大 | 小 |
| 优先级 | 更高(同时开启时) | 更低 |
重要规则 :当AOF开启时,RDB不再生效,Redis优先使用AOF恢复数据。
二、AOF配置与启用
2.1 启用AOF持久化
配置文件路径 :/etc/redis/redis.conf
配置步骤:
conf
# 开启AOF持久化
appendonly yes
# AOF文件名(默认)
appendfilename "appendonly.aof"
# AOF文件存储目录(默认)
dir /var/lib/redis/
目录结构示例:
/var/lib/redis/
├── dump.rdb # RDB文件(如果启用)
├── appendonly.aof # AOF文件
└── ...
2.2 AOF文件格式示例
bash
# AOF文件内容示例(文本格式)
*3
$3
SET
$4
name
$6
张三
*3
$3
SET
$3
age
$2
25
*2
$4
SADD
$7
members
$6
李四
格式说明:
*3:表示该命令有3个参数$3:表示接下来参数的长度为3字节- 实际内容按Redis协议格式存储
三、AOF性能优化机制
3.1 缓冲区机制
为什么AOF不拖慢Redis?
(1)首先,AOF持久化机制并不是直接让工作线程与磁盘打交道,而是先将操作写入到内存中的缓冲区,等缓冲区内达到刷新的条件的时候,再统一将缓冲区内的数据一起写入到磁盘当中。
这样大大降低了磁盘的IO次数,效率还是比较高的,
往往磁盘效率低是因为寻址,而不是顺序写入,所以一次写入多和少,差距并不大,反而是IO的次数,非常影响性能。
(2)其次,AOF持久化机制,是顺序追加,顺序追加的效率比起随机写入的效率高很多。
满足条件 未满足 客户端请求 Redis主线程 执行命令 写入内存缓冲区
aof_buf 缓冲区刷新条件 批量写入磁盘
性能优化点:
- 批量写入:减少磁盘IO次数
- 顺序追加:避免随机写入的寻址开销
- 异步处理:主线程不直接操作磁盘
3.2 刷新策略(appendfsync)
三种策略对比:
| 策略 | 机制 | 数据可靠性 | 性能 | 适用场景 |
|---|---|---|---|---|
| always | 每次写入立即刷盘 | 最高(几乎零丢失) | 最低 | 金融、交易等高可靠要求 |
| everysec | 每秒刷盘一次 | 高(最多丢失1秒数据) | 高 | 生产环境默认配置 |
| no | 由操作系统决定 | 低(可能丢失较多) | 最高 | 可接受数据丢失的场景 |
配置示例:
conf
# 推荐生产环境配置
appendfsync everysec
# 高安全要求场景
# appendfsync always
# 高性能低安全场景
# appendfsync no
数据丢失风险对比:

四、AOF重写机制
4.1 为什么要重写AOF?
问题分析:
运行时间长 → AOF文件过大 → 重启恢复慢 → 存储空间浪费
原因:记录了所有中间操作,存在大量冗余命令
所以,redis的AOF持久化机制就有重写机制,就是对aof文件进行整理优化,剔除冗余操作,保持aof文件足够精简并且数据准确的机制。
重写示例:
bash
# 原始AOF记录
SET counter 1
INCR counter # counter=2
INCR counter # counter=3
DEL counter
SET counter 100
# 重写后
SET counter 100 # 只保留最终状态
4.2 重写触发条件
手动触发:
bash
# 后台执行AOF重写
redis> bgrewriteaof
Background append only file rewriting started
自动触发配置:
conf
# 自动重写配置
auto-aof-rewrite-percentage 100 # 文件增长比例阈值
auto-aof-rewrite-min-size 64mb # 文件最小大小阈值
触发逻辑:
当前AOF文件大小 > 上次重写后大小 * (1 + auto-aof-rewrite-percentage/100)
and
当前AOF文件大小 > auto-aof-rewrite-min-size
→ 触发自动重写
4.3 AOF重写流程详解
bgrewriteaof 父进程 fork 子进程 3.1 读取内存快照 3.2 写入新AOF文件 aof_buf aof_rewrite_buf 5.1 信号通知父进程 5.2 父进程处理 5.3 追加命令到新AOF文件 旧AOF文件 新AOF文件 替换旧文件
关键设计要点:
- 双缓冲区 :
aof_buf(正常持久化)+aof_rewrite_buf(重写期间新命令),双缓冲区的设计,让子进程生成的新的aof文件的内容加上了fork之后的命令,避免出现数据丢失的情况,也满足了AOF实时持久化的设计初衷。 - 数据一致性:重写期间新命令不丢失
- 原子替换:新文件完成后才替换旧文件
4.4 重写冲突处理
收到bgrewriteaof 检查当前子进程 有AOF重写子进程 直接返回
不重复执行 有RDB子进程 等待RDB完成 阻塞客户端 RDB完成后执行AOF重写 无子进程 立即开始AOF重写
五、混合持久化(Redis 4.0+)
5.1 什么是混合持久化?
当开启混合持久化的时候,进行AOF重写的时候,就会按照rdb的格式(二进制写入),将内存中的redis数据的快照写入到新aof文件中,
后续aof_rewrite_buf的内容还是以文本的形式追加到aof文件的末尾,
这样子,在redis重启的时候,恢复历史数据更快,毕竟二进制读取的效率远高于文本读取的效率。
混合持久化AOF文件结构:
[ RDB二进制数据 ] + [ AOF增量命令 ]
↑ ↑
快照数据 重写后的新命令
配置开启:
conf
# 开启混合持久化
aof-use-rdb-preamble yes
5.2 混合持久化优势
- 快速恢复:RDB部分快速加载
- 数据安全:AOF部分保证最新数据
- 文件精简:比纯AOF文件小
文件内容示例 :

六、恢复历史数据对比
同时开启RDB和AOF持久化机制的时候,AOF的优先级更高,
会优先加载aof文件恢复历史数据,
毕竟aof的数据更新一些。
优先级说明 是 否 存在 不存在 存在 不存在 存在 不存在 否 是 否 是 AOF优先级高于RDB 开启AOF时忽略RDB 文件损坏导致启动失败 启动Redis 是否开启AOF? 检查AOF文件是否存在 检查RDB文件是否存在 加载AOF文件 是否存在RDB文件? 执行AOF重放命令 AOF恢复成功 Redis启动完成 加载RDB文件 空数据启动
无历史数据 加载RDB文件 RDB文件是否损坏? RDB文件是否损坏? RDB恢复成功 启动失败 检查错误日志
修复持久化文件
七、总结对比
7.1 RDB vs AOF vs 混合持久化
| 特性 | RDB | AOF | 混合持久化 |
|---|---|---|---|
| 持久化方式 | 快照 | 日志 | 快照+日志 |
| 数据安全 | 可能丢失最后快照后的新数据 | 最多丢失1秒数据 | 最多丢失1秒数据 |
| 恢复速度 | 快 | 慢 | 快 |
| 文件大小 | 小 | 大 | 中等 |
| 适用版本 | 所有版本 | 所有版本 | Redis 4.0+ |
| 生产推荐 | 备份/主从 | 高可靠性要求 | 最佳实践 |
7.2 选择建议
根据业务场景选择:
选择持久化策略 业务需求分析 需要快速恢复
容忍数据丢失 选择RDB 数据安全第一
可接受较慢恢复 选择AOF 需要平衡
性能与安全 Redis 4.0+ 选择混合持久化
通用建议:
- Redis 4.0+:开启混合持久化
- 数据安全关键:AOF + appendfsync everysec
- 快速备份恢复:RDB定时备份 + AOF实时保护
- 监控告警:密切关注AOF文件增长和重写频率
关键要点回顾
- AOF是实时日志:记录每个写操作,数据安全性高
- 缓冲区优化 :
everysec策略平衡性能与安全 - 重写机制:解决AOF文件膨胀问题
- 双缓冲设计:重写期间数据不丢失
- 混合持久化:RDB快照 + AOF增量,恢复快且安全