首页 > 数据库 >15天玩转redis —— 第十一篇 让你彻底了解RDB存储结构

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

时间:2023-04-18 12:40:09浏览次数:40  
标签:文件 15 database redis value 第十一篇 key RDB 就是

        接着上一篇说,这里我们来继续分析一下RDB文件存储结构,首先大家都知道RDB文件是在redis的“快照”的模式下才会产生,那么如果

我们理解了RDB文件的结构,是不是让我们对“快照”模式能做到一个心中有数呢???

 

一:RDB结构剖析

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

15天玩转redis —— 第十一篇  让你彻底了解RDB存储结构_其他

 

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

 

15天玩转redis —— 第十一篇  让你彻底了解RDB存储结构_数据_02

 

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

15天玩转redis —— 第十一篇  让你彻底了解RDB存储结构_数据_03

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

 

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结构是否如图所示。。。

 

15天玩转redis —— 第十一篇  让你彻底了解RDB存储结构_十六进制_04

 

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

 

15天玩转redis —— 第十一篇  让你彻底了解RDB存储结构_其他_05

 

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

 

1.  database [selectDB]: 可以看到,selectDB其实就是一个无法用unicode标记出来的一个字节,十六进制就是FE,当redis碰到这个字符

                                      的时候就知道自己该干嘛了。。。。要准备执行select命令了。。。

 

2.  database[db_number]: 在FE之后,我们看到了十六进制的 ”03“,也就是切换到第三个数据库中,还记得吗? 我之前在set数据的时候,

                                         曾今执行过 select 3,也就是将数据set到第3号数据库中,如果你忘记了,没关系,我用redis客户端打开给你看~~

15天玩转redis —— 第十一篇  让你彻底了解RDB存储结构_数据_06

 

3. database[pairs][type]:  当你知道select哪一号数据库之后,接下来的操作就是怎么去分析key,value数据了,在key/value数据中,第一个

                                      就是type,其实这个type就是你的value的encoding类型,可以看到在winHex中表示的0,也就是以下的源码:

15天玩转redis —— 第十一篇  让你彻底了解RDB存储结构_16进制_07

 

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的具体值。。。

 

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

 

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

15天玩转redis —— 第十一篇  让你彻底了解RDB存储结构_数据_08

标签:文件,15,database,redis,value,第十一篇,key,RDB,就是
From: https://blog.51cto.com/u_15353947/6202801

相关文章

  • 15天玩转redis —— 第一篇 开始入手
     双十一终于还是过去了,我负责的mongodb由于做了副本集,最终还是挺过去了,同事负责的redis,还是遗憾的在早上8点左右宕机了,然后大家就是马不停蹄的赶往公司解决问题,因为我对redis也不是很了解,工作上使用redis的时候也是应付的找找资料,所以没有从系统层......
  • 15天玩转redis —— 第七篇 同事的一次缓存操作引起对慢查询的认识
       上个星期同事做一个业务模块,需要将一个80M的数据存入到redis缓存中,想法总是好的,真操作的时候遇到了HSet超时,我们使用的是C#的StackExchange.Redis驱动。<redisCacheClientallowAdmin="true"ssl="false"connectTimeout="5000"abortConnect="false"database="......
  • 15天玩转redis —— 第十篇 对快照模式的深入分析
       我们知道redis是带有持久化这个能力了,那到底持久化成到哪里,持久化成啥样呢???这篇我们一起来寻求答案。 一:快照模式或许在用Redis之初的时候,就听说过redis有两种持久化模式,第一种是SNAPSHOTTING模式,还是一种是AOF模式,而且在实战场景下用的最多的莫过于SNAPSHOTT......
  • 15天玩转redis —— 第三篇 无敌的列表类型
     据说60%的人使用redis看重的是redis中的list类型,那这个list有什么用呢???不用我说大家都明白,做队列使用呗,为什么用它呢,很简单呗,因为有了它我就不需要专门的MQ产品啦,比如说RabbitMQ,ActiveMQ等等。。。对吧。 一:实战   先我们还是看一下List列表给......
  • 15天玩转redis —— 第六篇 有序集合类型
       今天我们说一下Redis中最后一个数据类型“有序集合类型”,回首之前学过的几个数据结构,不知道你会不会由衷感叹,开源的世界真好,写这些代码的好心人真的要一生平安哈,不管我们想没想的到的东西,在这个世界上都已经存在着,曾几何时,我们想把所有数据按照数据结构模式组成后......
  • 15天玩转redis —— 第二篇 基础的字符串类型
        我们都知道redis是采用C语言开发,那么在C语言中表示string都是采用char[]数组的,然后你可能会想,那还不简单,当我执行如下命令,肯定是直接塞给char[]数组的。如果你真的这么想的话,会有几个问题就要过来砍你了,先我们来找一个redis手册,http://doc.redisfans.com/ 第......
  • Linux环境安装Redis7
    大家好啊,最近在学redis,在虚拟机上安装花了不少时间,于是整理了一下详细的安装教程,有需要的小伙伴可以看看,避免踩坑!安装redis时虚拟机的前置条件我用的是centos7.6,这里默认大家都安好虚拟机了,如果没有安装的同学可以看我下一篇的博客......
  • 1581. 进店却未进行过交易的顾客
    【题目】表:Visits+-------------+---------+|ColumnName|Type   |+-------------+---------+|visit_id   |int    ||customer_id|int    |+-------------+---------+visit_id是该表的主键。该表包含有关光临过购物中心的顾客的信息。 表:Transaction......
  • Redis 克隆数据至新实例
    一、新建目标实例为方便测试,直接建在同一台服务器,起不同端口。#建新实例目录mkdir-p/data/redis/rd6380/{conf,datafile,log}#编辑新实例配置文件cp/data/redis/rd6379/conf/redis.conf/data/redis/rd6380/conf/redis.conf#修改新实例配置文件vi/data/redis/rd6380/co......
  • redis分布式锁使用
    1.引入pom依赖 2.代码实现 3,加上断点,测试执行中 加锁成功 执行结束,释放锁 ......