剖析Redis RDB文件
通过redis-cli中执行save
或者bgsave
可以得到RDB文件(文件名由配置文件中dbfilename指定,例如dbfilename "dump.rdb"),这个文件包含Redis实例中全量的数据,那么dump.rdb的文件格式大概是什么样的呢?
RDB文件定义
----------------------------# RDB is a binary format. There are no new lines or spaces in the file.
52 45 44 49 53 # Magic String "REDIS"
00 00 00 03 # RDB Version Number in big endian. In this case, version = 0003 = 3
----------------------------
FE 00 # FE = code that indicates database selector. db number = 00
----------------------------# Key-Value pair starts
FD $unsigned int # FD indicates "expiry time in seconds". After that, expiry time is read as a 4 byte unsigned int
$value-type # 1 byte flag indicating the type of value - set, map, sorted set etc.
$string-encoded-key # The key, encoded as a redis string
$encoded-value # The value. Encoding depends on $value-type
----------------------------
FC $unsigned long # FC indicates "expiry time in ms". After that, expiry time is read as a 8 byte unsigned long
$value-type # 1 byte flag indicating the type of value - set, map, sorted set etc.
$string-encoded-key # The key, encoded as a redis string
$encoded-value # The value. Encoding depends on $value-type
----------------------------
$value-type # This key value pair doesn't have an expiry. $value_type guaranteed != to FD, FC, FE and FF
$string-encoded-key
$encoded-value
----------------------------
FE $length-encoding # Previous db ends, next db starts. Database number read using length encoding.
----------------------------
... # Key value pairs for this database, additonal database
FF ## End of RDB file indicator
8 byte checksum ## CRC 64 checksum of the entire file.
备注: 参考Github官网RDB文件格式定义
获取RDB文件
我们首先通过redis-cli中执行save
得到dump.rdb文件,然后用WinHex打开这个文件:
dump.rdb.png
说明:导出RDB文件时整个Redis实例中db=0里有个string类型的username,值为afei;db=6里有个string类型的uname,值为root,且设置了失效时间;
剖析RDB文件
根据WinHex达到的dump.rdb文件一个一个字节剖析文件真实的内容,以52这个16进制数为例,其十进制数值为82,通过ASCII码对照表可知,82对应的字符是R,相应的:45->69->E,44->68->D,49->73->I,53->83->S,最终该RDB文件内容如下:REDIS
验证RDB文件定义
前面5个16进制52 45 44 49 53
已经被验证为REDIS
30 30 30 36
则表示RDB文件版本号
FE
表示db选择器编码,00
则表示选择编号为0这个db
00
这个ASCII码对应的字符为NUT,即
08
这个ASCII码对应的字符为BS,即BackSpace退格按键;
75 73 65 72 6E 61 6D 65 04 61 66 65 69
则表示:
username
afei
说明:04这个ASCII对应的字符是EOT,表示文尾,end of transmission;所以username的值afei是另起一行;
FE
表示db选择器编码,06
则表示选择编号为6这个db
FC
表示设置了毫秒级失效,接下来的8个字节表示失效时间的Unix时间戳;
4F D7 D3 E4 5D 01 00 00 00
表示失效时间Unix时间戳;
05
这一个字节表示value的类型:string,hash,list ,set,sorted set;
75 6E 61 6D 65 04 72 6F 6F 74
则表示:
uname
root
FF
表示RDB文件结束;
C7 41 31 D7 AA 1F 24 A2
这8个字节表示整个RDB文件的rdbsum CRC 64;
作者:阿飞的博客
来源:https://www.jianshu.com/p/c210851d3558
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com