1. 首页
  2. redis实践

剖析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打开这个文件:

pouxiredisrdbwenjian_1.png

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


看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:剖析Redis RDB文件

    链接:https://www.javajike.com/article/1676.html

« 001-一、RocketMQ源码分析之NameServer
剖析Redis协议»

相关推荐

QR code