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 持久化进化的核心成果。

相关推荐
standovon10 分钟前
Spring Boot整合Redisson的两种方式
java·spring boot·后端
Cosolar41 分钟前
LlamaIndex RAG 本地部署+API服务,快速搭建一个知识库检索助手
后端·openai·ai编程
MX_93591 小时前
SpringMVC请求参数
java·后端·spring·servlet·apache
忆想不到的晖2 小时前
Codex 探索:别急着调 Prompt,先把工作流收住
后端·agent·ai编程
weixin_408099672 小时前
【实战对比】在线 OCR 识别 vs OCR API 接口:从个人工具到系统集成该怎么选?
图像处理·人工智能·后端·ocr·api·图片文字识别·文字识别ocr
Victor3563 小时前
MongoDB(73)如何设置用户权限?
后端
Victor3563 小时前
MongoDB(74)什么是数据库级别和集合级别的访问控制?
后端
计算机学姐4 小时前
基于SpringBoot的咖啡店管理系统【个性化推荐+数据可视化统计+配送信息】
java·vue.js·spring boot·后端·mysql·信息可视化·tomcat
LSTM974 小时前
使用 Python 将图片转换为 PDF (含合并)
后端
小江的记录本4 小时前
【注解】常见 Java 注解系统性知识体系总结(附《全方位对比表》+ 思维导图)
java·前端·spring boot·后端·spring·mybatis·web