RDB持久化③RDB文件

200 阅读2分钟

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

RDB持久化③RDB文件

RDB文件是经过压缩的二进制文件,有5部分组成:头信息,db_version,databases,EOF,check_sum

头信息

RDB文件最开头是REDIS部分,长度为5字节,保存着“REDIS”五个字符,在载入文件时,能够快速检查所载入的文件是否为RDB文件。

db_version

db_version长度为4字节,值是一个字符串表示的整数,这个整数记录了RDB文件的版本号

databases

databases保存着数据库,以及各个数据库的键值对数据

下面我们重点看一下databases部分

databases部分有三个部分组成,SELECTDB db_number key_value_pairs

SELECTDB

SELECTDB常量长度为1个字节,表示程序读的会是一个数据库号码

db_number

db_number 保存着一个数据库号码,当程序读入db_number后,服务器会调用SELECT命令,根据读入的数据库号码进行数据库切换,这样读入的键值对可以载入到正确的数据库中。

key_value_pairs

key_value_pairs保存了数据库中所有键值对,如果键值对带有过期时间,那么过期时间会和键值对保存在一起

没有过期时间的键值对key_value_pairs结构为type key value

type记录value的类型,根据type的值读入value数据

带有过期时间的键值对key_value_pairs结构为expiretime_ms ms type key value

expiretime_ms 是常量,表示将要读入一个毫秒为单位的过期时间,ms为毫秒为单位的时间戳,这个时间戳就是键值对的过期时间

对于value我们下一篇文章再分析

EOF

EOF常量长度为1字节,这个常量标志着RDB文件正文内容的结束,当读入程序遇到这个值的时候,它知道所有数据库的所有键值对都载入完毕

check_sum

check_sum是一个8字节长的无符合整数,保存着一个校验和,这个校验和是程序通过对REDIS、db_version、databases、EOF四部分计算得出。服务器在载入RDB文件时,会对载入数据计算出的校验和与check_sum记录的校验和进行对比,依次检查RDB文件是否出错或损坏