# 介绍
RDB 文件中保存了内存中的数据库状态,也可以从 RDB 文件中还原出一个完整的数据库状态,避免数据意外丢失。
# RDB 文件的创建与载入
生成文件命令:
- SAVE,会阻塞服务器进程,期间服务器不能处理任何命令请求
- BGSAVE,派生出一个子进程,不会阻塞服务器进程,期间服务器会拒绝 SAVE 和 BGSAVE,避免竞争,BGSAVE 也不能和 BGREWRITEAOF 同时执行,避免同时执行大量的磁盘写入操作。
载入是在服务器启动时自动执行的,没有命令进行手动载入,期间服务器一直处于阻塞状态。不过如果服务器启动了 AOF,会优先使用 AOF 还原数据库状态。
# 自动间隔性保存
# 设置保存条件
命令:save {秒数} {修改数},可以设置多个条件
# dirty 计数器和 lastsave 属性
dirty 记录上一次成功执行 SAVE 或 BGSAVE 之后,服务器对数据库状态进行了多少次修改。
lastsave 记录上一次成功执行 SAVE 或 BGSAVE 的 UNIX 时间戳。
# 检查保存条件是否满足
操作性函数 serverCron 默认每隔 100 毫秒检查一次,如果满足 save 保存的条件,就执行 BGSAVE 命令。
# RDB 文件结构
- REDIS,5 字节,常量表示是 RDB 文件
- db_version,4 字节,记录 RDB 文件版本号
- databases,长度不定,记录领个或任意多个数据库,以及各个数据库中的键值对数据
- EOF,1 字节,标志 RDB 文件正文内容结束
- check_sum,8 字节,通过前 4 个部分计算出来的校验和,服务器在载入 RDB 文件时,根据这个来判断文件时会否出错或损坏
# databases
每个非空数据库的格式为:
- SELECTDB,1 字节,标志接下来是个数据库号码
- db_number,1 或 2 或 5 字节,保存一个数据库号码
- key_value_pairs,保存数据库中的所有键值对数据,包括过期时间
# key_value_pairs
# 不带过期时间的键值对
- TYPE,1 字节,记录了 value 的类型
- key,不定长,键,字符串对象
- value,不定长,值
# 带过期时间的键值对
- EXPIRETIME_MS,1 字节,表示接下来是一个以毫秒为单位的过期时间
- ms,8 字节,键值对的过期时间