Redis 设计草案 #2(历史)
Redis 早期开发时期的 RDB 格式设计
注意:这份文档由 Redis 的创建者 Salvatore Sanfilippo 在 Redis 开发初期(约 2013 年)撰写,是设计草案系列的一部分。这份文档是为了历史价值而保存的。
Redis 设计草案 2 -- RDB 版本 7 信息字段
- 作者:Salvatore Sanfilippo
antirez@gmail.com
- GitHub 问题 #1048
修订历史
1.0, 2013 年 4 月 10 日 - 初稿。
概述
Redis RDB 格式缺乏一种简单的方法,可以在不造成向后兼容性问题的情况下,将信息字段添加到 RDB 文件中,即使添加的元数据在从 RDB 文件加载数据时不需要。
例如,借助本文档中指定的信息字段,可以将诸如文件创建时间、生成文件的 Redis 版本以及任何其他有用信息等信息添加到 RDB 中,以一种不需要所有字段都能正确处理 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 版本
此字段表示一个以 null 结尾的字符串,其中包含生成文件的 Redis 版本,如 Redis 版本 INFO 字段中显示。