在 Redis 的 混合持久化模式 (aof-use-rdb-preamble yes
)下,AOF 文件由 二进制 RDB 数据 + 文本协议 AOF 日志 两部分组成,是一个逻辑连续但格式混合的文件。以下是详细解析:
一、混合持久化 AOF 文件结构
bash
+---------------------+-----------------------------------+
| RDB 全量数据 | 增量 AOF 操作日志 |
| (二进制格式) | (纯文本 RESP 协议) |
+---------------------+-----------------------------------+
↑ 文件开头 ↑ RDB 结束位置
二、RDB 部分:二进制格式
-
内容 :
最后一次执行BGREWRITEAOF
或满足重写条件时,Redis 内存数据的全量快照。 -
特点 :
- 二进制编码:非文本,不可直接阅读。
- 紧凑高效:使用 LZF 压缩,体积远小于文本日志。
- 文件头标识 :以魔数
REDIS
开头(十六进制5245 4449 53
)。
-
示例 (十六进制预览):
hex5245 4449 53 3030 31 ... [压缩的二进制数据] ... FF
5245 4449 53
= "REDIS"FF
= RDB 结束标志
三、AOF 部分:文本协议(RESP)
-
内容 :
RDB 快照生成后发生的所有写操作(增删改)。 -
协议格式 :
使用 Redis 序列化协议(RESP ),每条命令按以下规则编码:- 数组形式表示命令(
*<参数数量>\r\n
) - 每个参数为
$<长度>\r\n<数据>\r\n
- 数组形式表示命令(
-
示例 :
bash*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n *2\r\n$4\r\nINCR\r\n$6\r\ncounter\r\n
可视化解析 :
bash*3 # 3个参数 $3 SET # 参数1:长度3,值"SET" $5 mykey # 参数2:长度5,值"mykey" $7 myvalue # 参数3:长度7,值"myvalue"
四、文件生成流程(关键步骤)
sequenceDiagram
participant Client
participant RedisServer
participant AOFFile
Note over RedisServer: 初始状态:AOF 文件为纯文本格式(无 RDB 头部)
Client->>RedisServer: 执行写操作 (SET/DEL/INCR...)
RedisServer->>AOFFile: 追加文本协议命令(RESP 格式)
Note over RedisServer: 触发 AOF 重写条件(如文件过大)
RedisServer->>RedisServer: 执行 BGREWRITEAOF
RedisServer->>RedisServer: 生成内存快照(RDB 二进制数据)
RedisServer->>AOFFile: 1. 写入 RDB 数据(覆盖原文件头部)
RedisServer->>AOFFile: 2. 追加重写期间的新命令(RESP 文本)
AOFFile-->>RedisServer: 形成混合格式文件
五、为什么需要混合格式?
部分 | 优势 | 解决的原生 AOF 问题 |
---|---|---|
RDB 头部 | 快速加载全量数据 | 避免全文重放海量操作日志 |
AOF 尾部 | 保证数据完整性(无丢失) | RDB 快照生成后数据丢失风险 |
六、查看 AOF 文件内容的技巧
-
直接查看(文本部分):
bashtail -n +2 appendonly.aof | strings # 跳过 RDB 头部,显示文本命令
-
识别 RDB 边界:
bashod -c -N 10 appendonly.aof # 查看文件头
输出示例:
css0000000 R E D I S 0 0 0 � 377
REDIS0009
是 RDB 版本标识� 377
是二进制数据起始标志
-
官方工具:
bashredis-check-aof --fix appendonly.aof # 自动修复并打印结构
七、注意事项
- 文件不可手动编辑 :
二进制和文本混合格式导致人工编辑极易损坏文件。 - 版本兼容性 :
混合持久化需 Redis 4.0+,旧版本无法识别 RDB 头部。 - 恢复顺序 :
Redis 重启时先加载 RDB 部分,再顺序执行 AOF 日志命令。
总结
Redis 混合持久化 AOF 文件本质是:
一个文件 = 二进制 RDB 快照(文件头) + 文本 RESP 命令流(文件尾)
- RDB 部分:提供高效的全量恢复基础(二进制紧凑)。
- AOF 部分:确保增量数据零丢失(文本协议可追踪)。
这种设计平衡了 恢复速度 与 数据安全,是 Redis 持久化进化的核心成果。