2.3 RDB文件结构
完整的RDB文件结构:
全大写代表常量,全小写代表变量和数据
2.3.1 各部分概述
- REDIS
作用:RDB文件标识符。通过这五个字符,程序可以在载入文件时,快速检查所载入的文件是否为RDB文件
长度:5字节,保存REDIS这五个字符
- db_version
作用:RDB文件的版本号。如0006代表第六版,为此次介绍的RDB文件结构的版本号
长度:4字节,值是一个字符串表示的整数
- databases
作用:包含0或多个数据库及其对应的键值对数据
长度:如果服务器数据库状态为空,则为0;如果不为空,则根据键值对的数量、类型和内容,长度也随之而变
- EOF
作用:RDB文件结束符。标志着RDB文件正文内容的结束,读入程序遇到这个值时,代表所有数据库的所有键值对都载入完毕了
长度:1字节
- check_sum
作用:检查RDB文件是否有出错或损坏。是程序通过对REDIS、db_version、databases、EOF四个部分的内容进行计算而出的;载入RDB文件时,会将载入数据所计算出的校验和与check_sum进行对比,从而得出是否出错
长度:8字节的无符号整数
2.3.2 RDB#databases部分
结构:
- SELECTDB
作用:数据库标识符,当读入程序遇到此值,它知道接下来要读入的是一个数据库
长度:1字节
- db_number
作用:数据库号码。读入此部分时,服务器会调用SELECT命令,切换数据库,使得之后读入的键值对可以载入到正确的数据库中
长度:根据数据库号码的不同,可以分为1、2、5字节
- key_value_pairs
作用:保存了数据库中的所有键值对数据,包括可能存在的过期时间
长度:根据键值对的数量、类型和内容,长度也随之而变
2.3.3 databases#key_value_pairs部分
结构:EXPIRETIME_MS和ms可能没有
- TYPE
作用:记录了value的雷系,程序会根据TYPE的值来决定如何读入和解释value的数据,其值可以为如图之一,每个常量都代表了一种对象类型或底层编码:
长度:1字节
- key
作用:保存了键值对的键。总是为一个字符串对象,编码方式和REDIS_RDB_TYPE_STRING类型的value一样
长度:根据内容长度的不同,key的长度也会有所不同
- value
作用:保存了键值对的值
长度:根据TYPE类型、保存内容长度的不同,key的长度也会有所不同
- EXPIRETIME_MS
作用:过期时间标识符。当读入程序遇到此值,它知道接下来要读入的是一个以毫秒为单位的过期时间
长度:1字节
- ms
作用:记录一个以毫秒为单位的UNIX时间戳,即该键值对的过期时间
长度:8字节
2.3.4 key_value_pairs#value的编码
不同类型的值对象在RDB文件中的保存结构:
- 字符串对象
TYPE:REDIS_RDB_TYPE_STRING
编码类型:REDIS_ENCODING_INT、REDIS_ENCODING_RAW
REDIS_ENCODING_INT
保存长度不超过32位的整数:
ENCODING可以为REDIS_RDB_ENC_INT8、REDIS_RDB_ENC_INT16或REDIS_RDB_ENC_INT32,分别代表使用8、16、32位来保存整数值integer
REDIS_ENCODING_RAW
保存字符串值;
在打开RDB文件压缩功能的情况下(redis.conf的rdbcompression),根据字符串长度的不同,分为压缩和不压缩两种方式来保存:如果小于等于20,则不压缩;如果大于20,则压缩;没打开则直接按无压缩方式保存
例子:
无压缩结构:len为长度、string为内容
压缩结构:LZF算法、压缩后的长度、原长度、压缩后的字符串;后三个属性用来解压缩
- 列表对象
TYPE:REDIS_RDB_TYPE_LIST
编码类型:REDIS_ENCODING_LINKEDLIST
结构:每个项是一个字符串对象
例子:三个元素及其对应的长度
- 集合对象
TYPE:REDIS_RDB_TYPE_SET
编码类型:REDIS_ENCODING_HT
结构:每个项都是一个字符串对象
例子:四个元素及其对应的长度
- 哈希对象
TYPE:REDIS_RDB_TYPE_HASH
编码类型:REDIS_ENCODING_HT
结构:
例子:两个键值对及其长度
- 有序集合对象
TYPE:REDIS_RDB_TYPE_ZSET
编码:REDIS_ENCODING_SKIPLIST
结构:
例子:两个元素及其长度
- INTSET编码的集合
TYPE:REDIS_RDB_TYPE_SET_INTSET
保存对象:整数集合对象
保存方式:先将整数集合转换为字符串对象,再保存到RDB文件里
读入方式:根据TYPE值的提示,先读入字符串对象,再转换成原来的整数集合对象
- ZIPLIST编码的列表、哈希表、有序集合
TYPE:REDIS_RDB_TYPE_LIST_ZIPLIST、REDIS_RDB_TYPE_HASH_ZIPLIST、REDIS_RDB_TYPE_ZSET_ZIPLIST
保存对象:压缩列表对象
保存方式:
读入方式:
2.4 分析RDB文件
使用od命令来分析,该命令可以用给定的格式转存(dump)并打印输入文件
2.4.1 不包含任何键值对的RDB文件
例子:od -c dump.rdb
依次为"REDIS"字符串、版本号、EOF常量、校验和
2.4.2 包含字符串键的RDB文件
例子:
依次为"REDIS"字符串、版本号、SELECTDB常量、使用0号数据库、无过期时间的键值对(TYPE、键长度、键、值长度、值)、EOF常量、校验和
2.4.3 包含带有过期时间的字符串键的RDB文件
例子:
依次是:
2.4.4 包含一个集合键的RDB文件
例子:
依次是: