当前位置: 移动技术网 > IT编程>数据库>Redis > 了解redis中RDB结构_动力节点Java学院整理

了解redis中RDB结构_动力节点Java学院整理

2017年11月30日  | 移动技术网IT编程  | 我要评论
rdb文件是在redis的“快照”的模式下才会产生,那么如果我们理解了rdb文件的结构,是不是让我们对“快照”模式能做到一个心中有数呢??? 一、rdb结构剖析   首

rdb文件是在redis的“快照”的模式下才会产生,那么如果我们理解了rdb文件的结构,是不是让我们对“快照”模式能做到一个心中有数呢???

一、rdb结构剖析

  首先呢,我们要对rdb文件有一个概念性的认识,比如下面画的图一样:

从图中,我们大概看到了rdb文件的一个简要的存储模式,但为了更好的方便对照,我准备save一个empty database,对比一下看看效果:

然后我们用winhex打开dump.rdb文件,看看它的16进制。

好了,该打开的我都打开了,下面我们一一来比较一下。

1. redis参数: 可以看到在16进制的前5个字节中,是“redis"五个大字母,这个的作用显而易见,肯定就是判断当前的文件是否为“rdb文件“,这样才方便用常量的时间来判别。。。

2. db_version: 在redis字符之后,我们看到了占用4个字节的0006,这个就是rdb文件结构图中的 db_version。对吧,同样也很简单,就是判断当前redis的版本号,对否???

3. database: 由于我演示的是一个empty database,自然没有相应的结构,等下我们再插入记录,再对比一下。

4. eof: 从winhex上面你是否看到了,它占用一个字节的空间,就是一个“y”上面加了两点,由于用unicode无法表示,所以出现了这么个乱码,当然16进制可以标识,就是所谓的“ff”,看到了没有??? 那么它的作用就是标识database的结束。

5. checksum: 从名字上你就可以看得到,它就是一个校验和,原理当然就是看文件是否损坏,或者是否被修改,这样有点像现在的oauth验证,对吧,它占用了8个字节,也就是最后的:dc b3 43 f0 5a dc f2 56。。。

二、带数据的rdb文件结构演示

好了,上面我已经演示了除database之外的所有参数,下面我们来set一个最简单的string类型,看看database结构是否如图所示。

用winhex打开dump.rdb文件如下:

为了方便对照,我在图中标记了一下database开始的位置,也就是十六进制的 fe。。。

1. database [selectdb]: 可以看到,selectdb其实就是一个无法用unicode标记出来的一个字节,十六进制就是fe,当redis碰到这个字符的时候就知道自己该干嘛了。。。。要准备执行select命令了。。。

2. database[db_number]: 在fe之后,我们看到了十六进制的 ”03“,也就是切换到第三个数据库中,还记得吗? 我之前在set数据的时候,曾今执行过select 3,也就是将数据set到第3号数据库中,如果你忘记了,没关系,我用redis客户端打开给你看~~

3. database[pairs][type]: 当你知道select哪一号数据库之后,接下来的操作就是怎么去分析key,value数据了,在key/value数据中,第一个就是type,其实这个type就是你的value的encoding类型,可以看到在winhex中表示的0,也就是以下的源码:

4.database[pairs][key][len]: 在type之后,就是所谓的key,而key的组合模式是【len,value】,其中len就是key的长度,你也可以看到,winhex中表示的是 “04”,也就是说name的长度为4。对吧。。。

5.database[pairs][key][value] 同样的道理,这里的模式也是【len,value】,前面为value的length,后面为value的具体值。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网