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

相关推荐
David爱编程23 分钟前
final 修饰变量、方法、类的语义全解
java·后端
椒哥25 分钟前
Open feign动态切流实现
java·后端·spring cloud
佳佳_32 分钟前
Lock4j 在多租户缓存插件中不起作用
spring boot·后端
RainbowSea33 分钟前
购买服务器 + 项目部署上线详细步骤说明
java·服务器·后端
Jacob023435 分钟前
很多数据分析师写对了 SQL,却忽略了这件更重要的事
后端·sql·数据分析
超浪的晨2 小时前
Java 单元测试详解:从入门到实战,彻底掌握 JUnit 5 + Mockito + Spring Boot 测试技巧
java·开发语言·后端·学习·单元测试·个人开发
艺杯羹4 小时前
MyBatis 之缓存机制核心解析
java·后端·spring·mybatis
Brookty4 小时前
【Java学习】匿名内部类的向外访问机制
java·开发语言·后端·学习
程序员爱钓鱼4 小时前
Go语言实战案例-快速排序实现
后端·google·go
程序员爱钓鱼4 小时前
Go语言实战案例-链表的实现与遍历
后端·google·go