`

RDB 文件结构

阅读更多
        在RDB 持久化一节中,我们对 RDB 持久化功能进行了详细的介绍,这一节将对 RDB 文件结构作进一步的剖析。
        一个完成的 RDB 文件结构按顺序包含如下几个部分:
        * REDIS 常量:RDB 文件的最开头部分,长度为 5 个字节,保存着“REDIS”五个字符(没有普通 C 字符串末尾的'\0'字符,因为 RDB 文件保存的是二进制数据),程序在载入文件时可凭此快速检查所载入的文件是否是 RDB 文件。
        * db_version:长度为 4 个字节的字符串表示的整数,记录了 RDB 文件的版本号,比如“0006”就代表 RDB 文件的版本为第六版。
        * databases:这部分包含零个或任意多个数据库,以及各个数据库中的键值对数据,其实际长度随数据库所保存键值对的数量、类型和内容的不同而有所不同。
        * EOF 常量:RDB 文件正文内容结束标记,长度为 1 字节。
        * check_sum:8 字节长的无符号整数,保存着程序对前面几个部分内容计算得出的校验和,用于在载入 RDB 文件时,通过与新计算的载入数据校验和做比对,以此来检查 RDB 文件是否有出错或者损坏的情况出现。
        接下来重点说一下 databases 部分。
        一个 RDB 文件的 databases 部分是由所有非空数据库所组成,每个非空数据库按顺序包含三个部分:
        * SELECTDB 常量:长度为 1 字节,标识接下来将要读入一个新的数据库。
        * db_number:表示几号数据库。根据号码的大小不同,其长度可以是 1 字节、2字节或者 5 字节。当程序读入这部分后,就会立即调用 SELECT 命令切换到对应的数据库,使得之后读入的键值对可以载入到正确的数据库中。
        * key_value_pairs:这部分保存了对应号码数据库中的所有键值对数据,过期时间(如果有)也会随之保存。这部分的长度与键值对的数量、类型、内容以及是否有过期时间等条件有关。
        下图是一个完整的 RDB 文件结构示意图,其中包含了 0 号数据块库和 3 号数据库。

        这里的 pairs 部分保存了一个以上的键值对,以及可能的过期时间。一个带有过期时间的键值对在 RDB 文件中的结构包含以下几个部分(无过期时间的键值对没有前面两个字段):
        * EXPIRETIME_MS 常量:长度为 1 字节,标识着即将读入一个以毫秒为单位的过期时间。
        * ms:8 字节长的有符号整数,记录着一个以毫秒为单位的 UNIX 时间戳,表示的就是对应键的过期时间。
        * TYPE 常量:长度为 1 字节,记录了键值的类型,值可以是以下常量之一:REDIS_RDB_TYPE_STRING、REDIS_RDB_TYPE_LIST、REDIS_RDB_TYPE_SET、REDIS_RDB_TYPE_ZSET、REDIS_RDB_TYPE_HASH、REDIS_RDB_TYPE_LIST_ZIPLIST、REDIS_RDB_TYPE_SET_INTSET、REDIS_RDB_TYPE_ZSET_ZIPLIST、REDIS_RDB_TYPE_HASH_ZIPLIST。这里的每个 TYPE 常量都代表了一种对象类型或者底层编码,程序会根据这个值来决定如何读入和解释后续的 value 数据。
        * key:键值对的键对象,总是一个编码同 REDIS_RDB_TYPE_STRING 类型的 value 一样的字符串对象。其长度跟内容长度有关。
        * value:键值对的值对象。根据 TYPE 类型以及保存内容长度的不同,保存 value 的结构和长度也会有所不同。
        下面来说一下每个键值对的 value 值对象在 RDB 文件中的保存结构情况。
        如果 TYPE 的值为 REDIS_RDB_TYPE_STRING,说明 value 保存的就是一个字符串对象,字符串对象的编码可以是 REDIS_ENCODING_INT 或者 REDIS_ENCODING_RAW。
        若字符串对象的编码为 REDIS_ENCODING_INT,表示对象中保存的是长度不超过 32 位的整数,这种编码的对象将以“ENCODING + integer”的结构保存,其中的 ENCODING 常量可以是 REDIS_RDB_ENC_INT8、REDIS_RDB_ENC_INT16 或者 REDIS_RDB_ENC_INT32,分别代表整数值 integer 是 8 位、16 位或者 32 位。
        若字符串对象的编码为 REDIS_ENCODING_RAW,表示对象所保存的是一个字符串值。根据字符串长度的不同,有压缩和不压缩两种方法来保存这个字符串(当然,这要在服务器打开了 RDB 文件压缩功能的情况下,如果服务器关闭了 RDB 文件压缩功能,则总是以无压缩的方式保存字符串值,具体可参考 rdbcompression 配置选项说明):如果字符串的长度大于 20 字节,则该字符串会被压缩之后再保存,否则直接原样保存。
        对于没有被压缩的字符串,RDB 会以“len + string”的结构来保存,如下图表示保存的是一个无压缩的长度为 5 的“hello”字符串。

        而对于压缩后的字符串,其保存结构则如下图所示。

        其中,REDIS_RDB_ENC_LZF 常量表示字符串已被 LZF 算法压缩过了,之后的 compressed_len 记录的是字符串被压缩后的长度,origin_len 记录的则是原始长度,compressed_string 是压缩后的字符串。下图是一个压缩后的字符串示例,从中可以看出,字符串原本的长度为 21,压缩后的长度为 6,压缩后的内容为“?aa???”,这里的“?”代表无法用字符串形式打印出来的字节。

        其他 TYPE 类型的对象的保存方式都是采取同样的形式,即“elementNum + elements”,只是对于其中的数值内容,程序会先将其转换成字符串对象后,再用保存字符串对象的方法进行保存。
        以有序集合为例,即 TYPE 的值为 REDIS_RDB_TYPE_ZSET,此时 value 保存的就是一个 REDIS_ENCODING_SKIPLIST 编码的有序集合对象,每个 element 由“member + score”两部分构成,其中 member 是一个字符串对象,score 则是一个 double 类型的浮点数,程序在保存 RDB 文件时就会将 score 部分转换成字符串对象后再保存。下图就是一个拥有两个元素的有序集合的保存示例。

        其中,第一个数字 2 表示有序集合的元素数量,之后跟着的两个有序集合元素:第一个元素是长度为 2 的字符串“pi”,其分值 score 部分被转换成字符串后变成了长度为 4 的字符串“3.14”;第二个元素是长度为 1 的字符串“e”,其分值 score 部分被转换成字符串后变成了长度为 3 的字符串“2.7”。


参考书籍:《Redis 设计与实现》第十章——RDB 持久化。
  • 大小: 16.2 KB
  • 大小: 3.1 KB
  • 大小: 14.3 KB
  • 大小: 7.4 KB
  • 大小: 7.4 KB
分享到:
评论

相关推荐

    RDB文件解包/打包工具

    该工具提供了解包功能,能够将RDB文件的内容转化为人类可读的格式,方便查看和理解数据结构。解包过程中,工具确保了极低的错误率,仅为0.1%,这意味着在大量数据中,只有极少数记录可能在解包过程中出现错误,极大...

    RDB打包解包工具.rar

    1.本工具是根据作者对RDB文件结构进行黑箱分析推测出来的,并无事实依据.经过测试解包后再打包的文件与源文件大小相同,但是内容不同,经过测试可以替换正常使用.但是请务必在修改前做好原文档的备份. 2.本工具只能解包...

    QQ资源RDB文件打开工具【解包/打包】

    - **RDB文件结构**:RDB文件内部通常包含一个或多个表,每个表由若干记录组成,记录又由字段构成。理解这一结构对于解包和打包RDB文件至关重要。 - **资源编码**:QQ资源可能经过特定的编码方式处理,例如PNG图片...

    自动驾驶软件VTD的输出RDB结构说明

    RDB文件是VTD仿真过程中的记录数据库,它包含了在仿真期间车辆、传感器、交通参与者等所有对象的状态信息。这些信息包括但不限于: 1. **时间戳**:每个数据记录对应的时间点,用于精确同步不同对象的行为。 2. **...

    RDB打包解包工具

    解析RDB文件需要理解其内部结构,包括头部信息、资源ID、数据长度和实际数据等。RDB打包解包工具通过读取并分析这些信息,能够将RDB文件拆分成可编辑的原始资源。 二、资源编辑 利用RDB打包解包工具,用户可以查看...

    rdb 文件查看工具

    在实际应用中,RDB文件查看工具可以帮助数据库管理员监控和诊断Redis服务的问题,例如检查数据一致性、分析数据结构或排查性能瓶颈。同时,对于软件开发者来说,它可以作为一种资源管理工具,方便地提取和利用内置的...

    RDB打包解包工具2.3最新版

    1.本工具是根据作者对RDB文件结构进行黑箱分析推测出来的,并无事实依据.经过测试解包后再打包的文件与源文件大小相同,但是内容不同,经过测试可以替换正常使用.但是请务必在修改前做好原文档的备份. 2.本工具只能解包...

    rdb文件修改工具.zip

    请注意,直接修改RDB文件可能会破坏其结构,因此通常不推荐在生产环境中这样做。 3. **打包与解包RDB文件**:工具可能提供文件打包和解包功能,方便用户在不同环境间传输RDB文件,或者对文件进行备份和恢复操作。...

    (转)rdb文件解包和打包为rdb格式文件的工具

    解包工具会识别rdb文件的内部结构,将数据以可读的形式展现出来,比如文本或图像。对于想要自定义QQ皮肤的用户来说,这一步至关重要,因为可以从中获取到皮肤相关的图片和配置信息。 另一方面,打包rdb文件则是将...

    RDB格式文件打包解包工具

    当需要备份Redis的数据时,RDB打包工具能够将RDB文件进行压缩处理,减小存储空间占用,并便于传输。打包过程通常涉及到对二进制文件的读取、解析以及压缩算法的应用,如gzip或lz4,以实现高效的数据压缩。 解包则是...

    rdb打包解包3.9(更新)

    1.本工具是根据作者对RDB文件结构进行黑箱分析推测出来的,并无事实依据.经过测试解包后再打包的文件与源文件大小相同,但是内容不同,经过测试可以替换正常使用.但是请务必在修改前做好原文档的备份. 2.本工具只能解包...

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

    **RDB 文件结构** 1. **Redis 标识**: RDB 文件以 "REDIS" 五个字节作为文件的起始标识,便于快速识别文件类型。这是文件的第一个特征,用来确保读取的文件确实是 Redis 的 RDB 文件。 2. **db_version**: 接...

    rdb后缀资源文件通用解包打包工具

    .rdb文件通常是专有的二进制格式,包含各种类型的资源,如图片、字符串、配置等,它们被压缩和加密,以便在应用程序运行时快速加载和解码。这种文件格式的目的是提高应用程序的性能和安全性,但同时也给用户自定义和...

    读取QQ资源(rdb)文件源码

    为了能够解析和读取这些文件,我们需要深入理解rdb文件的结构以及如何用C++(VC2008)来编写相应的读取程序。下面将详细介绍这个过程。 首先,rdb文件的结构通常是基于数据库的设计,包含多个表,每个表有各自的...

    RDB资源打包解包工具

    由于RDB文件的结构,它通常需要特定的工具才能打开、查看和编辑其中的内容。 资源打包是指将应用程序所需的各类资源(如图片、音频、视频、文本等)整合到一起,形成一个或多个打包文件的过程。这样做有几大好处:...

    RDB打开工具

    RDB文件通常存储了数据库的结构信息,包括表定义、索引、触发器、存储过程等,以及数据本身。它们是数据库管理系统用来持久化数据的方式之一,确保即使在系统关闭后,数据也能被准确地恢复。由于这些文件通常由...

    T2080RDB设计文件

    “SPF-28286_C.pdf”可能是PCB制版文件,通常包含有用于生产PCB板的详细规格和工艺要求,如层叠结构、导电路径、阻焊层和丝印等信息,对于制造出符合设计意图的电路板至关重要。 “LAY-28286_C.rar”和“t2080pcie_...

    gft、rdb 等文件解包工具

    2. 解析RDB文件:RDB解包工具则能读取RDB文件的结构,展示其中的表格数据,允许用户访问和导出数据。 需要注意的是,这些工具可能有其特定的使用方法和限制。例如,它们可能需要用户有一定的技术背景,才能理解解包...

Global site tag (gtag.js) - Google Analytics