Redis RDB持久化机制

RDB文件的创建与载入

RDB是Redis默认的持久化方式。有两个Redis命令可以用于生成RDB文件,一个是SAVE,另一个是BGSAVESAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求:
在这里插入图片描述

和SAVE命令直接阻塞服务器进程的做法不同,BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求:

在这里插入图片描述

另外值得一提的是,因为AOF文件的更新频率通常比RDB文件的更新频率高,所以:如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF 文件来还原数据库状态。只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据库状态。服务器判断该用哪个文件来还原数据库状态的流程如下图所示。

在这里插入图片描述

  1. SAVE命令执行时的服务器状态
    前面提到过,当SAVE命令执行时,Redis服务器会被阻塞,所以当SAVE命令正在执行时,客户端发送的所有命令请求都会被拒绝。只有在服务器执行完SAVE命令、重新开始接受命令请求之后,客户端发送的命令才会被处理。
  2. BGSAVE命令执行时的服务器状态
    因为BGSAVE命令的保存工作是由子进程执行的,所以在子进程创建RDB文件的过程中,Redis服务器仍然可以继续处理客户端的命令请求。
  3. RDB文件载入时的服务器状态
    服务器在载入RDB文件期间,会一直处于阻塞状态,直到载入工作完成为止。

在BGSAVE命令执行期间,客户端如果发送的SAVE命令服务器会怎样执行?

此命令会被服务器拒绝,因为这两个条件会产生竞争条件

在BGSAVE命令执行期间,客户端如果发送的BGREWITEAOF命令服务器会怎样执行?

BGREWITEAOF命令会等到服务器执行完BGSAVE命令再去执行

在BGSAVE命令执行期间,客户端如果再次发送BGSAVE命令会如何?

会被服务器拒绝执行

RDB文件自动间隔性保存

前面我们介绍了SAVE命令和BGSAVE命令,并且说明了这两个命令在实现方面的主要区别:SAVE命令由服务器进程执行保存工作,BGSAVE命令则由子进程执行保存工作,所以SAVE命令会阻塞服务器,而BGSAVE命令则不会。因为BGSAVE命令可以在不阻塞服务器进程的情况下执行,所以Redis允许用户通过设置服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令。用户可以通过save选项设置多个保存条件,但只要其中任意一个条件被满足,服务器就会执行BGSAVE命令。

举个例子,我们向服务器提供以下配置:
在这里插入图片描述
那么只要满足以下三个条件中的任意一个,BGSAVE命令就会被执行:

  • 服务器在900秒之内,对数据库进行了至少1次修改。
  • 服务器在300秒之内,对数据库进行了至少10次修改。
  • 服务器在60秒之内,对数据库进行了至少10000次修改。

RDB文件结构

下图展示了一个完整RDB文件所包含的各个部分:
在这里插入图片描述

  1. RDB文件的最开头是REDIS部分,这个部分的长度为5字节,保存着"REDIS"五个字符。通过这五个字符,程序可以在载入文件时,快速检查所载入的文件是否RDB文件。
  2. db_version长度为4字节,它的值是一个字符串表示的整数,这个整数记录了RDB文件的版本号,比如"0006"就代表RDB文件的版本为第六版。
  3. databases部分包含着零个或任意多个数据库,以及各个数据库中的键值对数据;
    1. 如果服务器的数据库状态为空(所有数据库都是空的),那么这个部分也为空,长度为0字节。
    2. 如果服务器的数据库状态为非空(有至少一个数据库非空),那么这个部分也为非空,根据数据库所保存键值对的数量、类型和内容不同,这个部分的长度也会有所不同。
  4. EOF常量的长度为1字节,这个常量标志着RDB文件正文内容的结束,当读入程序遇到这个值的时候,它知道所有数据库的所有键值对都已经载入完毕了。
  5. check_sum是一个8字节长的无符号整数,保存着一个校验和,这个校验和是程序通过对REDIS、db_version、databases、EOF 四个部分的内容进行计算得出的。服务器在载入RDB文件时,会将载入数据所计算出的校验和与check_sum 所记录的校验和进行对比,以此来检查RDB文件是否有出错或者损坏的情况出现。

总结

  • RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据。
  • SAVE命令由服务器进程直接执行保存操作,所以该命令会阻塞服务器。
  • BGSAVE令由子进程执行保存操作,所以该命令不会阻塞服务器。
  • 服务器状态中会保存所有用save选项设置的保存条件,当任意一个保存条件被满足时,服务器会自动执行BGSAVE命令。
  • RDB文件是一个经过压缩的二进制文件,由多个部分组成。
  • 对于不同类型的键值对,RDB文件会使用不同的方式来保存它们。

猜你喜欢

转载自blog.csdn.net/weixin_44533129/article/details/112686000