- 浏览: 141045 次
文章分类
最新评论
在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 持久化。
一个完成的 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 持久化。
发表评论
-
Lua 脚本
2019-10-07 19:49 662Redis 2.6 版本开始引入对 Lua 脚 ... -
Redis事务的实现
2019-09-22 18:56 465Redis 事务是 ... -
Redis集群之复制、故障转移及消息实现
2019-09-14 21:04 496在Redis集群 ... -
Redis集群实现原理
2019-09-14 12:19 662Redis 集群是 Redis 提供的分布式数 ... -
sentinel 系统介绍
2019-08-04 18:35 499Sentinel(哨兵)是 Redis 的高可 ... -
数据库复制
2019-07-13 22:02 363在连接到一 ... -
redis 客户端实现
2019-06-02 15:06 368Redis 服务器是典型的一对多服务器程序,通 ... -
AOF 持久化
2019-05-12 13:36 412除了前面提到的 RDB 持久化功能外,Redi ... -
RDB 持久化
2019-04-14 17:20 419RDB 持久化功能可以将 Redis 在某个时 ... -
Redis 数据库通知功能的实现
2019-04-07 11:56 1280Reids 数据库通知功能可以让客户端通过订阅 ... -
数据库实现
2019-03-24 13:58 437Redis 服务器将其所有的数据库都保存在 r ... -
Redis 五种对象
2019-01-20 11:13 361阅读本节前需要阅读 Redis 对象系统概览一 ... -
Redis 对象系统概览
2019-01-06 13:10 776前面介绍了 Redis 中用到的所有主要数据结 ... -
整数集合与压缩列表
2018-12-09 21:19 591在 Redis 中,当一 ... -
跳跃表在 Redis 中的应用
2018-08-23 16:30 2022前提申明,因篇幅 ... -
字典实现
2018-08-20 15:49 563字典在 Redis 中的应用相当广泛,如 Redis ... -
redis 字符串和列表实现
2018-08-08 16:41 747Redis 虽说由 C 语言 ...
相关推荐
该工具提供了解包功能,能够将RDB文件的内容转化为人类可读的格式,方便查看和理解数据结构。解包过程中,工具确保了极低的错误率,仅为0.1%,这意味着在大量数据中,只有极少数记录可能在解包过程中出现错误,极大...
1.本工具是根据作者对RDB文件结构进行黑箱分析推测出来的,并无事实依据.经过测试解包后再打包的文件与源文件大小相同,但是内容不同,经过测试可以替换正常使用.但是请务必在修改前做好原文档的备份. 2.本工具只能解包...
- **RDB文件结构**:RDB文件内部通常包含一个或多个表,每个表由若干记录组成,记录又由字段构成。理解这一结构对于解包和打包RDB文件至关重要。 - **资源编码**:QQ资源可能经过特定的编码方式处理,例如PNG图片...
RDB文件是VTD仿真过程中的记录数据库,它包含了在仿真期间车辆、传感器、交通参与者等所有对象的状态信息。这些信息包括但不限于: 1. **时间戳**:每个数据记录对应的时间点,用于精确同步不同对象的行为。 2. **...
解析RDB文件需要理解其内部结构,包括头部信息、资源ID、数据长度和实际数据等。RDB打包解包工具通过读取并分析这些信息,能够将RDB文件拆分成可编辑的原始资源。 二、资源编辑 利用RDB打包解包工具,用户可以查看...
在实际应用中,RDB文件查看工具可以帮助数据库管理员监控和诊断Redis服务的问题,例如检查数据一致性、分析数据结构或排查性能瓶颈。同时,对于软件开发者来说,它可以作为一种资源管理工具,方便地提取和利用内置的...
1.本工具是根据作者对RDB文件结构进行黑箱分析推测出来的,并无事实依据.经过测试解包后再打包的文件与源文件大小相同,但是内容不同,经过测试可以替换正常使用.但是请务必在修改前做好原文档的备份. 2.本工具只能解包...
请注意,直接修改RDB文件可能会破坏其结构,因此通常不推荐在生产环境中这样做。 3. **打包与解包RDB文件**:工具可能提供文件打包和解包功能,方便用户在不同环境间传输RDB文件,或者对文件进行备份和恢复操作。...
解包工具会识别rdb文件的内部结构,将数据以可读的形式展现出来,比如文本或图像。对于想要自定义QQ皮肤的用户来说,这一步至关重要,因为可以从中获取到皮肤相关的图片和配置信息。 另一方面,打包rdb文件则是将...
当需要备份Redis的数据时,RDB打包工具能够将RDB文件进行压缩处理,减小存储空间占用,并便于传输。打包过程通常涉及到对二进制文件的读取、解析以及压缩算法的应用,如gzip或lz4,以实现高效的数据压缩。 解包则是...
1.本工具是根据作者对RDB文件结构进行黑箱分析推测出来的,并无事实依据.经过测试解包后再打包的文件与源文件大小相同,但是内容不同,经过测试可以替换正常使用.但是请务必在修改前做好原文档的备份. 2.本工具只能解包...
**RDB 文件结构** 1. **Redis 标识**: RDB 文件以 "REDIS" 五个字节作为文件的起始标识,便于快速识别文件类型。这是文件的第一个特征,用来确保读取的文件确实是 Redis 的 RDB 文件。 2. **db_version**: 接...
.rdb文件通常是专有的二进制格式,包含各种类型的资源,如图片、字符串、配置等,它们被压缩和加密,以便在应用程序运行时快速加载和解码。这种文件格式的目的是提高应用程序的性能和安全性,但同时也给用户自定义和...
为了能够解析和读取这些文件,我们需要深入理解rdb文件的结构以及如何用C++(VC2008)来编写相应的读取程序。下面将详细介绍这个过程。 首先,rdb文件的结构通常是基于数据库的设计,包含多个表,每个表有各自的...
由于RDB文件的结构,它通常需要特定的工具才能打开、查看和编辑其中的内容。 资源打包是指将应用程序所需的各类资源(如图片、音频、视频、文本等)整合到一起,形成一个或多个打包文件的过程。这样做有几大好处:...
RDB文件通常存储了数据库的结构信息,包括表定义、索引、触发器、存储过程等,以及数据本身。它们是数据库管理系统用来持久化数据的方式之一,确保即使在系统关闭后,数据也能被准确地恢复。由于这些文件通常由...
“SPF-28286_C.pdf”可能是PCB制版文件,通常包含有用于生产PCB板的详细规格和工艺要求,如层叠结构、导电路径、阻焊层和丝印等信息,对于制造出符合设计意图的电路板至关重要。 “LAY-28286_C.rar”和“t2080pcie_...
2. 解析RDB文件:RDB解包工具则能读取RDB文件的结构,展示其中的表格数据,允许用户访问和导出数据。 需要注意的是,这些工具可能有其特定的使用方法和限制。例如,它们可能需要用户有一定的技术背景,才能理解解包...