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

相关推荐
IT_陈寒1 分钟前
Redis性能提升30%的秘密:5个被低估的高级命令实战解析
前端·人工智能·后端
追逐时光者15 分钟前
推荐 4 款基于 .NET 开源、功能强大的文件管理工具,助力高效的整理文件与文件夹!
后端·.net
风象南24 分钟前
告别日志“大海捞针”,基于SpringBoot的错误指纹聚类实现
spring boot·后端
做运维的阿瑞4 小时前
Python零基础入门:30分钟掌握核心语法与实战应用
开发语言·后端·python·算法·系统架构
猿究院-陆昱泽5 小时前
Redis 五大核心数据结构知识点梳理
redis·后端·中间件
yuriy.wang6 小时前
Spring IOC源码篇五 核心方法obtainFreshBeanFactory.doLoadBeanDefinitions
java·后端·spring
咖啡教室8 小时前
程序员应该掌握的网络命令telnet、ping和curl
运维·后端
你的人类朋友8 小时前
Let‘s Encrypt 免费获取 SSL、TLS 证书的原理
后端
老葱头蒸鸡8 小时前
(14)ASP.NET Core2.2 中的日志记录
后端·asp.net
李昊哲小课9 小时前
Spring Boot 基础教程
java·大数据·spring boot·后端