redis混合模式下,AOF日志格式是怎么样的?

115 阅读3分钟

在 Redis 的 混合持久化模式aof-use-rdb-preamble yes)下,AOF 文件由 二进制 RDB 数据 + 文本协议 AOF 日志 两部分组成,是一个逻辑连续但格式混合的文件。以下是详细解析:


一、混合持久化 AOF 文件结构

+---------------------+-----------------------------------+
|   RDB 全量数据      |        增量 AOF 操作日志          |
|   (二进制格式)      |       (纯文本 RESP 协议)          |
+---------------------+-----------------------------------+
  ↑ 文件开头           ↑ RDB 结束位置

二、RDB 部分:二进制格式

  1. 内容
    最后一次执行 BGREWRITEAOF 或满足重写条件时,Redis 内存数据的全量快照
  2. 特点
    • 二进制编码:非文本,不可直接阅读。
    • 紧凑高效:使用 LZF 压缩,体积远小于文本日志。
    • 文件头标识:以魔数 REDIS 开头(十六进制 5245 4449 53)。
  3. 示例(十六进制预览):
    5245 4449 53 3030 31  ...  [压缩的二进制数据]  ... FF
    
    • 5245 4449 53 = "REDIS"
    • FF = RDB 结束标志

三、AOF 部分:文本协议(RESP)

  1. 内容
    RDB 快照生成后发生的所有写操作(增删改)。
  2. 协议格式
    使用 Redis 序列化协议(RESP),每条命令按以下规则编码:
    • 数组形式表示命令(*<参数数量>\r\n
    • 每个参数为 $<长度>\r\n<数据>\r\n
  3. 示例
    *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
    
    可视化解析
    *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 文件内容的技巧

  1. 直接查看(文本部分)

    tail -n +2 appendonly.aof | strings  # 跳过 RDB 头部,显示文本命令
    
  2. 识别 RDB 边界

    od -c -N 10 appendonly.aof  # 查看文件头
    

    输出示例:

    0000000   R   E   D   I   S   0   0   0377
    
    • REDIS0009 是 RDB 版本标识
    • � 377 是二进制数据起始标志
  3. 官方工具

    redis-check-aof --fix appendonly.aof  # 自动修复并打印结构
    

七、注意事项

  1. 文件不可手动编辑
    二进制和文本混合格式导致人工编辑极易损坏文件。
  2. 版本兼容性
    混合持久化需 Redis 4.0+,旧版本无法识别 RDB 头部。
  3. 恢复顺序
    Redis 重启时先加载 RDB 部分,再顺序执行 AOF 日志命令。

总结

Redis 混合持久化 AOF 文件本质是:
一个文件 = 二进制 RDB 快照(文件头) + 文本 RESP 命令流(文件尾)

  • RDB 部分:提供高效的全量恢复基础(二进制紧凑)。
  • AOF 部分:确保增量数据零丢失(文本协议可追踪)。

这种设计平衡了 恢复速度数据安全,是 Redis 持久化进化的核心成果。