这是我参与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文件是否出错或损坏