总体结构
RDB文件为二进制格式保存,下面我们为了演示效果,采用字符串的形式演示
- REDIS(常量):RDB文件的最开头是REDIS部分,这个部分的长度为5字节,保存着“REDIS”五个字符。 通过这五个字符,程序可以在载入文件时,快速检查所载入的文件是否RDB文件
- db_version(变量):长度为4字节,它的值是一个字符串表示的整数,这个整数记录了RDB文件的 版本号,比如"0006"就代表RDB文件的版本为第六版
- databases(变量):databases部分包含着零个或任意多个数据库,以及各个数据库中的键值对数据
- 如果服务器的数据库状态为空(所有数据库都是空的),那么这个部分也为空,长度为 0字节
- 如果服务器的数据库状态为非空(有至少一个数据库非空),那么这个部分也为非空, 根据数据库所保存键值对的数量、类型和内容不同,这个部分的长度也会有所不同
- EOF(常量):EOF常量的长度为1字节,这个常量标志着RDB文件正文内容的结束,当读入程序遇到这 个值的时候,它知道所有数据库的所有键值对都已经载入完毕了
- check_sum(变量):check_sum是一个8字节长的无符号整数,保存着一个校验和,这个校验和是程序通过对 REDIS、db_version、databases、EOF四个部分的内容进行计算得出的。服务器在载入RDB文件时,会将载入数据所计算出的校验和与check_sum所记录的校验和进行对比,以此来检查RDB文件是否有出错或者损坏的情况出现
作为例子,下图展示了一个databases部分为空的RDB文件:文件开头的"REDIS"表示 这是一个RDB文件,之后的"0006"表示这是第六版的RDB文件,因为databases为空,所以版 本号之后直接跟着EOF常量,最后的6265312314761917404是文件的校验和
一、database部分结构
- 一个RDB文件的databases部分可以保存任意多个非空数据库。例如,如果服务器的0号数据库和3号数据库非空,那么服务器将创建一个如下图所示的RDB文件
database部分结构
- 每个非空数据库在RDB文件中都可以保存为SELECTDB、db_number、key_value_pairs三个部分:
- SELECTDB常量:长度为1字节,当读入程序遇到这个值的时候,它知道接下来要读入的将是一个数据库号码
- db_number:保存着一个数据库号码,根据号码的大小不同,这个部分的长度可以是1字 节、2字节或者5字节。当程序读入db_number部分之后,服务器会调用SELECT命令,根据读 入的数据库号码进行数据库切换,使得之后读入的键值对可以载入到正确的数据库中
- key_value_pairs部分:保存了数据库中的所有键值对数据,如果键值对带有过期时间,那 么过期时间也会和键值对保存在一起。根据键值对的数量、类型、内容以及是否有过期时间 等条件的不同,key_value_pairs部分的长度也会有所不同(在下面详细介绍)
- 下图则展示了一个完整的RDB文件,文件中包含了0号数据库和3号数据库
二、key_value_pairs部分结构
- key_value_pairs部分都保存了一个或以上数量的键值对,如果键值对带有过期时间的话,那么键值对的过期时间也会被保存在内
不带过期时间的键值对结构
- 不带过期时间的键值对在RDB文件中由TYPE、key、value3部分组成:
- TYPE:记录了value的类型,长度为1字节,值可以是以下常量的其中一个(以下列出的每个TYPE常量都代表了一种对象类型或者底层编码,当服务器读入RDB文 件中的键值对数据时,程序会根据TYPE的值来决定如何读入和解释value的数据。key和 value分别保存了键值对的键对象和值对象):
- 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
- key:其中key总是一个字符串对象,它的编码方式和REDIS_RDB_TYPE_STRING类型的 value一样。根据内容长度的不同,key的长度也会有所不同
- value:根据TYPE类型的不同,以及保存内容长度的不同,保存value的结构和长度也会有所不同(后面详细介绍)
- 下图展示了一个没有过期时间的字符串键值对:
- 假设0号数据库中有2个键值对,且这2个键值对都不带有过期时间如下图所示:
带有过期时间的键值对结构
- 带有过期时间的键值对在RDB文件中由EXPIRETIME_MS、ms、TYPE、key、value五部分组成:
- EXPIRETIME_MS常量:长度为1字节,它告知读入程序,接下来要读入的将是一个以 毫秒为单位的过期时间
- ms:是一个8字节长的带符号整数,记录着一个以毫秒为单位的UNIX时间戳,这个时间 戳就是键值对的过期时间
- TYPE、key、value:和前面不带有过期时间的键值对结构意义一样
- 下图展示了一个带有过期时间的集合键值对,其中键的过期时间为 1388556000000(2014年1月1日零时)
- 假设0号数据库中有2个不带有过期时间的键值对,数据库3含有1个不带有过期时间的键值对和1个带有过期时间的键值对
三、TYPE字段与value的编码
- RDB文件中的每个value部分都保存了一个值对象,每个值对象的类型都由与之对应的TYPE记录,根据类型的不同,value部分的结构、长度也会有所不同
字符串对象
待续。。。