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文件加载数据不是必需的,也不会导致向后兼容性问题。
例如,由于本文档中指定的信息字段,可以以不需要每个字段的方式向RDB添加信息,如文件创建时间、生成文件的Redis版本以及任何其他有用信息,以便正确处理RDB版本7文件。
此外,只需进行最小的更改,就可以在不实际支持额外字段的情况下,将RDB版本7的支持添加到Redis 2.6中,只需在加载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字段中所示。