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

相关推荐
GetcharZp8 小时前
比 Zap 还要快?Go 社区高性能日志神器 Zerolog 落地实践指南
后端
anzhxu8 小时前
Go基础之环境搭建
开发语言·后端·golang
刀法如飞8 小时前
一款Python语言Django框架DDD脚手架,适合中大型项目
后端·python·领域驱动设计
zb200641209 小时前
SpringBoot详解
java·spring boot·后端
AI人工智能+电脑小能手9 小时前
【大白话说Java面试题】【Java基础篇】第7题:HashMap的get流程是什么
java·后端·面试·哈希算法·散列表·hash-index·hash
霸道流氓气质10 小时前
SpringBoot+LangChain4j+Ollama+RAG(检索增强生成)实现私有文档向量化检索回答
java·spring boot·后端
MiNG MENS10 小时前
基于SpringBoot和Leaflet的行政区划地图掩膜效果实战
java·spring boot·后端
IT_陈寒10 小时前
Vite静态资源加载把我坑惨了
前端·人工智能·后端
2601_9498146911 小时前
Spring Boot中的404错误:原因、影响及处理策略
java·spring boot·后端
RDCJM11 小时前
Spring Boot spring.factories文件详细说明
spring boot·后端·spring