今年年初翻译的,都忘得差不多了,最近想用Go写个程序解析RDB文件,重新翻出来。
翻译自:
https://github.com/sripathikrishnan/redis-rdb-tools/wiki/Redis-RDB-Dump-File-Format
如果对本文档的后续更新有兴趣,可关注:https://github.com/wen866595/open-doc
Redis RDB 文件格式
Redis *.rdb 文件是一个内存内存储的二进制表示法。这个二进制文件足以完全恢复Redis的状态。
rdb文件格式为快速读和写优化。LZF压缩可以用来减少文件大小。通常,对象前面有它们的长度,
这样,在读取对象之前,你可以准确地分配内存大小。
为快速读/写优化意味着磁盘上的格式应该尽可能接近于在内存里的表示法。这种方式正是rdb文件采用的。
导致的结果是,在不了解Redis在内存里表示数据的数据结构的情况下,你没法解析rdb文件。
解析RDB的高层算法
在高层层面看,RDB文件有下面的格式:
----------------------------# RDB 是一个二进制文件。文件里没有新行或空格。
52 45 44 49 53 # 魔术字符串 "REDIS"
00 00 00 03 # RDB 版本号,高位优先。在这种情况下,版本是 0003 = 3
----------------------------
FE 00 # FE = code 指出数据库选择器. 数据库号 = 00
----------------------------# 键值对开始
FD $unsigned int # FD 指出 "有效期限时间是秒为单位". 在这之后,读取4字节无符号整数作为有效期限时间。
$value-type # 1 字节标记指出值的类型 - set,map,sorted set 等。
$string-encoded-key # 键,编码为一个redis字符串。
$encoded-value # 值,编码取决于 $value-type.
----------------------------
FC $unsigned long # FC 指出 "有效期限时间是豪秒为单位". 在这之后,读取8字节无符号长整数作为有效期限时间。
$value-type # 1 字节标记指出值的类型 - set,map,sorted set 等。
$string-encoded-key # 键,编码为一个redis字符串。
$encoded-value # 值,编码取决于 $value-type.
----------------------------
$value-type # 这个键值对没有有效期限。$value_type 保证 != to FD, FC, FE and FF
$string-encoded-key
$encoded-value
----------------------------
FE $length-encoding # 前一个数据库结束,下一个数据库开始。数据库号用长度编码读取。
----------------------------
... # 这个数据库的键值对,另外的数据库。
FF ## RDB 文件结束指示器
8 byte checksum ## 整个文件的 CRC 32 校验和。
继续阅读 →