*Redis 设计草案 2 -- RDB 版本 7 信息字段
- 作者:Salvatore Sanfilippo
antirez@gmail.com - GitHub 议题 #1048
*修订历史
1.0,2013 年 4 月 10 日 - 初始草案。
*概述
Redis RDB 格式缺乏一种简单的方式来向 RDB 文件添加信息字段,而不会导致向后兼容性问题,即使添加的元数据并不是从 RDB 文件加载数据所必需的。
例如,多亏了本文档中指定的信息字段,将可以向 RDB 添加文件创建时间、生成文件的 Redis 版本等信息,而且并不是每个字段都是正确处理 RDB 版本 7 文件所必需的。
此外,只需进行最小更改,就可以在不实际支持附加字段的情况下为 Redis 2.6 添加 RDB 版本 7 支持,只需在加载 RDB 文件时跳过它们即可。
RDB 信息字段在需要时可以具有语义意义,因此该字段的存在可以添加关于 RDB 文件格式中指定的数据集的信息,然而当需要正确解码某个信息字段以理解和加载 RDB 文件的数据集内容时,必须增加 RDB 文件格式,以便以前版本的 Redis 不会尝试加载它。
然而目前信息字段的设计仅用于保存加载数据集所不需要的附加信息,但可以更好地指定 RDB 文件是如何创建的。
*信息字段表示
RDB 格式 6 具有以下布局:
- 9 字节魔数 "REDIS0006"
- 键值对
- EOF 操作码
- CRC64 校验和
RDB 格式 7 的建议是在前 9 字节魔数之后立即添加可选字段,因此新格式将是:
- 9 字节魔数 "REDIS0007"
- 信息字段 1
- 信息字段 2
- ...
- 信息字段 N
- 信息字段结束标记
- 键值对
- EOF 操作码
- CRC64 校验和
每个信息字段具有以下结构:
- 16 位标识符
- 64 位数据长度
- 长度与指定值完全精确的数据部分
标识符和数据长度都以小端字节序存储。
特殊标识符 0 表示没有其他信息字段,RDB 文件的其余部分包含键值对。
*信息字段的处理
只要 RDB 版本与它所能加载的版本匹配,程序可以简单地跳过它不理解的每个信息字段。
*信息字段 ID 和内容的规范
*信息字段 0 -- 信息字段结束
这仅仅表示没有更多的信息字段需要处理。
*信息字段 1 -- 创建日期
该字段表示创建 RDB 文件时的 Unix 时间。Unix 时间的格式是一个 64 位小端整数,表示自 1970 年 1 月 1 日以来的秒数。
*信息字段 2 -- Redis 版本
该字段表示一个以空字符结尾的字符串,包含生成文件的 Redis 版本,如 Redis 版本 INFO 字段中显示的那样。