Redis 单机数据库的实现—RDB 持久化

介绍

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 字节,键值对的过期时间
-------------本文结束感谢您的阅读-------------

本文标题:Redis 单机数据库的实现—RDB 持久化

文章作者:

发布时间:2019年11月15日 - 00:11

最后更新:2021年12月10日 - 13:12

原始链接:http://huihui.couplecoders.tech/2019/1D5AD2J/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。