Redis设计与实现-8.RDB持久化

RDB持久化功能,可以将Redis在内存中的数据库状态保存到磁盘里面,既可以手动执行,也可以根据配置定期执行,该功能可以将某一个时间点上的数据库状态保存带一个RDB文件上。RDB文件是一个经过压缩的二进制文件

创建和载入

两个Redis命令回生成RDB文件,一个是SAVE,一个是BGSAVE

SAVE:会阻塞Redis服务器的进程,直到RDB文件创建完毕,在服务器进程阻塞期间,服务器不能处理任何请求。
BGSAVE
:会派生出一个子进程,然后由子进程完成RDB文件的创建,服务器进程继续处理命令请求。

RDB文件的载入是在服务器启动的时候自动执行的,且载入的时候服务器会处于阻塞状态,直到载入完成。

因为AOF文件更新频率会RDB文件高,所以会出现如下状况:

  • 如果开启了AOF持计划功能,那么服务器会优先使用AOF文件来还原数据库。
  • 只有在AOF持久化功能处于关闭状态下,服务器才会使用RDB文件来还原数据库。

BGSAVE执行时候服务器状态

执行BGSAVE的时候,服务器会拒绝SAVE命令,也会拒绝BGSAVE命令,防止了竞争条件的产生。

BGSAVE命令和BGREWRITEAOF命令也不能同时执行(原因是同时进行大量磁盘写入操作,对性能不友好):

  • 如果BGSAVE正在执行,那么BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕之后。
  • 如果BGREWRITEAOF正在执行,那么客户端会直接拒绝BGSAVE命令。

自动间隔保存

Redis允许用户通过设置服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令。用户可以通过save选项设置多个保存条件,只要其中一个条件满足,服务器就会执行BGSAVE命令。

提供如下save选项配置(Redis默认配置):

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

设置保存条件

当Redis服务器启动时,用户可以通过指定配置文件或者传入启动参数的方式设置save选项,如果没有主动设置save选项,采用默认配置。

dirty计数器和lastsave属性

dirty计数器记录距离上一次成功执行SAVE命令或者BGSAVE命令之后,服务器对数据库状态进行了多少次修改。

lastsave属性是一个UNIX时间戳,记录了服务器上一次执行成功SAVE命令或者BGSAVE命令的时间。

检查保存条件是否满足

Redis的服务器周期性操作函数serverCron默认每隔100毫秒执行一次,其中一项工作就是检查save选项所设置的保存条件是否已经满足,如果满足,执行BGSAVE命令。

posted @ 2020-04-28 17:07  名字可以起这么长  阅读(160)  评论(0编辑  收藏  举报