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

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


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

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

二、RDB 部分:二进制格式

  1. 内容 :
    最后一次执行 BGREWRITEAOF 或满足重写条件时,Redis 内存数据的全量快照。

  2. 特点 :

    • 二进制编码:非文本,不可直接阅读。
    • 紧凑高效:使用 LZF 压缩,体积远小于文本日志。
    • 文件头标识 :以魔数 REDIS 开头(十六进制 5245 4449 53)。
  3. 示例 (十六进制预览):

    hex 复制代码
    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. 示例 :

    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 文件内容的技巧

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

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

    bash 复制代码
    od -c -N 10 appendonly.aof  # 查看文件头

    输出示例:

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

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

七、注意事项

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

总结

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

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

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

相关推荐
苍何7 小时前
开源微信流 Windows,微信聊天记录,可以直接给 Codex 和 Obsidan 了
后端
代码什么用8 小时前
Spring基础使用
java·后端·spring
明月_清风8 小时前
Deno 终局来了:从挑战 Node 到被 Cloudflare 收编
前端·后端·node.js
蜗牛互联网9 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端
用户693717500138411 小时前
2026,程序员的时代拐点到了
android·前端·后端
惜鸟11 小时前
从源码看 pi 的上下文管理:原始数据永久保留,模型视角按需裁剪
后端
量化分析码农11 小时前
【Python量化策略评估体系 #05】极端行情扛得住吗?2008/2015/2020 三场景压力测试
后端
十年Java程序媛11 小时前
Java 接口和抽象类对比|Java8 新特性,抛弃老旧八股,正确选型
java·spring boot·后端
IT_陈寒11 小时前
SpringBoot自动配置差点让我加班到凌晨
前端·人工智能·后端
用户83562907805112 小时前
使用 Python 对 Excel 工作表进行排序
后端·python