15天玩转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的具体值。。。

好了,大概就说这么多了,希望对你有帮助。。。

~~~~~圣诞快乐~~~~~

时间: 2024-10-27 01:31:36

15天玩转redis —— 第十一篇 让你彻底了解RDB存储结构的相关文章

15天玩转redis —— 第八篇 你不得不会的事务玩法

我们都知道redis追求的是简单,快速,高效,在这种情况下也就拒绝了支持window平台,学sqlserver的时候,我们知道事务还算是个比较复杂的东西, 所以这吊毛要是照搬到redis中去,理所当然redis就不是那么简单纯碎的东西了,但是呢,事务是我们写程序无法逃避的场景,所以redis作者折衷的写了个简 化版的事务机制,下面我来扯一下它的蛋蛋. 一: 事务实战 具体到事务是什么,要保证什么...这个我想没必要说了,先不管三七二十一,看一下redis手册,领略下它的魔力. 1. multi,

15天玩转redis —— 第十篇 对快照模式的深入分析

我们知道redis是带有持久化这个能力了,那到底持久化成到哪里,持久化成啥样呢???这篇我们一起来寻求答案. 一:快照模式 或许在用Redis之初的时候,就听说过redis有两种持久化模式,第一种是SNAPSHOTTING模式,还是一种是AOF模式,而且在实战场景下用的最多的 莫过于SNAPSHOTTING模式,这个不需要反驳吧,而且你可能还知道,使用SNAPSHOTTING模式,需要在redis.conf中设置配置参数,比如下面这样: # Save the DB on disk: # # sa

15天玩转redis —— 第六篇 有序集合类型

今天我们说一下Redis中最后一个数据类型 “有序集合类型”,回首之前学过的几个数据结构,不知道你会不会由衷感叹,开源的世界真好,写这 些代码的好心人真的要一生平安哈,不管我们想没想的到的东西,在这个世界上都已经存在着,曾几何时,我们想把所有数据按照数据结构模式组成 后灌输到内存中,然而为了达到内存共享的方式,不得不将这块内存包装成wcf单独部署,同时还要考虑怎么序列化,何时序列互的问题,烦心事太多 太多...后来才知道有redis这么个吊毛玩意,能把高级的,低级的数据结构单独包装到一个共享内存

15天玩转redis —— 第四篇 哈希对象类型

redis中的hash也是我们使用中的高频数据结构,它的构造基本上和编程语言中的HashTable,Dictionary大同小异,如果大家往后有什么逻辑需要用 Dictionary存放的话,可以根据场景优先考虑下redis哦,起码可以装装逼嘛,现在我默认你已经有装逼的冲动了,打开redis手册,看看有哪些我们用得到 的装逼方法. 一:常用方法 只要是一个数据结构,最基础的永远是CURD,redis中的insert和update,永远只需要set来替代,比如下面的Hset,如下图: 前面几篇文章我

15天玩转redis —— 第一篇 开始入手

双十一终于还是过去了,我负责的mongodb由于做了副本集,最终还是挺过去了,同事负责的redis,还是遗憾的在早上8点左右宕机了,然后大家就是马不停 蹄的赶往公司解决问题,因为我对redis也不是很了解,工作上使用redis的时候也是应付的找找资料,所以没有从系统层次上了解redis,准备用这个系列来整理整理 自己所了解的redis. 一:Redis是什么? 这个我想怎么总结呢,突然发现再好的解释也没有redis官网解释的好,它的解释已经达到超宇宙的级别了...不信你可以看看. 人家也说了,r

15天玩转redis —— 第二篇 基础的字符串类型

我们都知道redis是采用C语言开发,那么在C语言中表示string都是采用char[]数组的,然后你可能会想,那还不简单,当我执行如下命令,肯定是直 接塞给char[]数组的. 如果你真的这么想的话,会有几个问题就要过来砍你了,先我们来找一个redis手册,http://doc.redisfans.com/ 第一:如果你每次都执行Append函数,那是不是redis的char[]每次都需要再次扩容,这样是不是每次都是耗时操作呢? 第二:如果你每次执行String中的StrLen,那redis底

15天玩转redis(mark,redis学习系列)

转自:http://www.cnblogs.com/huangxincheng/p/4966258.html 双十一终于还是过去了,我负责的mongodb由于做了副本集,最终还是挺过去了,同事负责的redis,还是遗憾的在早上8点左右宕机了,然后大家就是马不停 蹄的赶往公司解决问题,因为我对redis也不是很了解,工作上使用redis的时候也是应付的找找资料,所以没有从系统层次上了解redis,准备用这个系列来整理整理 自己所了解的redis. 一:Redis是什么? 这个我想怎么总结呢,突然发

第二十一篇:Linux 操作系统中的进程结构

前言 在 Linux 中,一个正在执行的程序往往由各种各样的进程组成,这些进程除了父子关系,还有其他的关系.依赖于这些关系,所有进程构成一个整体,给用户提供完整的服务( 考虑到了终端,即与用户的交互 ). 本文将详细描述 Linux 中的进程结构. 进程结构 上图所描述的是为了给用户提供一次完整服务( 需要处理用户IO等 )所涉及到的一个完整的进程结构,几个部分解释如下: 1. 控制进程 建立与终端连接的进程称为控制进程( 属于后台进程组之一 ) 2. 前台进程组 控制终端( 处理如Ctrl+C

第二十一课 线性表的链式存储结构

顺序存储结构线性表的最大问题是: 插入和删除需要移动大量的元素. 链式存储结构: 插入元素图解: current先指向头结点,在第几个位置插入元素,就向后移动几次. 图解: 小结: 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9643496.html