java(优化19) 15天玩转redis之第十一篇
来源:互联网 发布:服装市场数据 编辑:程序博客网 时间:2024/06/04 19:22
这里我们来继续分析一下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的具体值...
好了,大概就说这么多了,希望对你有帮助...
- java(优化19) 15天玩转redis之第十一篇
- java(优化18) 15天玩转redis之第十篇
- java(优化七) 15天玩转redis之第一篇
- 第十一篇:JAVA常用类之格式化
- 第十一篇: JAVA加密解密之Base64
- java(优化八) 15天玩转redis之第二篇
- java(优化九) 15天玩转redis之第三篇
- java(优化10) 15天玩转redis之第四篇
- java(优化11) 15天玩转redis之第五篇
- java(优化12) 15天玩转redis之第六篇
- java(优化14) 15天玩转redis之第七篇
- java(优化16) 15天玩转redis之第八篇
- java(优化17) 15天玩转redis之第九篇
- 15天玩转redis —— 第十一篇 让你彻底了解RDB存储结构
- 第十一篇 RMI远程方法调用之Java项目实例
- Java进阶之欧拉工程 第十一篇【持续更新】
- 第十一篇:C代码调用Java代码之项目实战
- redis之路第一篇
- {模板}对拍
- win7下关于安装 MySQL-5.7.14 步骤
- 点击动态表格数据+自定义属性+跳转页面编码
- MarkDown入门
- 关于tomcat有时出现的ClassNotFound错误
- java(优化19) 15天玩转redis之第十一篇
- 关于解决android studio各种疑难杂症系列---- 混淆规则不正确
- Jquery 点击tr取出某个td标签值
- 4.4 效果更好的滚动
- OpenSceneGraph实现的NeHe OpenGL教程 - 第十七课
- Android文字图片写入CSV(Base64)并分享
- 5.2 设备环境
- ora-8103 解决脚本
- OpenSceneGraph实现的NeHe OpenGL教程 - 第十八课