《Redis设计与实现》之第十章:RDB持久化
RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态。(数据库状态:服务器中的非空数据库以及它们的键值对统称为数据库状态)
一.RDB文件的创建和载入
1.save和bgsave命令可以用来生成RDB文件
save命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求
bgsave命令会派生出一个子进程,然后子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求
2.RDB文件的载入
RDB文件的载入工作是在服务器启动的时候自动执行的,只要Redis服务器在启动时检测到RDB文件存在,就会自动载入RDB文件(所以Redis并没有专门用于载入RDB文件的命令)。在服务器在载入RDB文件期间,会一直处于阻塞状态,直到载入完成。
注意:
因为AOF文件的更新频率通常比RDB文件的更新频率高,所以:
如果服务器开启了AOF持久化功能,服务器会优先使用AOF文件来还原数据库状态。只有AOF持久化功能处于关闭时,服务器才会使用RDB文件来还原数据库状态。
2.命令执行时服务器状态
执行save命令时,客户端发送的所有命令请求都会被阻塞。save命令执行完后,客户端命令才会被处理
执行bgsave命令时,子进程创建RDB文件,服务器可以正常处理客户端的命令请求。
注意:执行bgsave命令时,客户端发送的save,bgsave命令会被服务器拒绝,客户端发送的bgrewriteaof命令会被延迟到bgsave命令执行完毕后执行
二,自动间隔性保存
1.配置bgsave保存的条件,redis.conf
save 900 1 服务器在900秒内,对数据库进行了至少一次修改
save 300 10 服务器在300秒内,对数据库进行了至少10次修改
save 60 10000 服务器在60秒内,对数据库进行了至少10000次修改
上面的条件是默认的设置(如果我们不设置 save的值,就按照上面的默认条件)。当服务器启动时,程序会根据save选项设置的保存条件,设置服务器状态redisServer结构的saveparams属性:
struct redisServer{
//记录了保存条件的数组
struct saveparam *saveparams;
}
saveparams属性是一个数组,数组中的每个元素都是一个saveparam结构,每个saveparam结构都保存了一个save选项设置的保存条件:
struct saveparam{
//秒数
time_t seconds;
//修改数
int changes;
}
那怎么让上面的配置条件生效呢?
1.redisServer还维持一个dirty计数器和lastsave属性
dirty计数器记录服务器对数据库状态进行了多少次修改,执行save或bgsave命令后,dirty归零
lastsave属性是一个时间戳,记录服务器上一次成功执行save或bgsave命令的时间
2.服务器周期性操作函数serverCron默认每隔100毫秒执行一次,检查save选项设置的保存条件是否满足。
dirty和changes比较, lastsave-nowtime 和 second比较。只要有一个条件满足,服务器就执行bgsave命令
三,RDB文件结构