世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。
RDB持久化可以通过调用两个方法实现:save和bgsave;
调用save方法生成rdb文件时,使用的是主进程,所以在rdb文件生成之前,进程不能处理其他的命令。
调用bgsave方法生成rdb文件时,主进程会创建一个子进程来进行生成rdb文件的操作,而主进程仍然可以处理其他操作。在执行bgsave时,为了避免竞争与冲突,会拒绝其他的save及bgsave,bgrewriteaof也会延迟执行。
RDB文件载入是在服务器启动时自动载入的,并且有一点要注意,如果开启了AOF,服务器会优先选择载入AOF文件而不是rdb文件。在服务器载入期间,会一直处于阻塞状态,直到载入完成为止。
redis可以通过配置文件redis.conf配置bgsave执行的条件与频率,默认:
// 900秒内至少执行修改操作一次
save 900 1
// 300秒内至少执行修改操作10次
save 300 10
// 60秒内只好执行修改操作10000次
save 60 10000
只要满足其中任何一个条件,bgsave都会被执行。
关于状态记录的数据结构:
struct redisServer{
saveparams;
dirty;
lastsave;
}
struct saveparam{
seconds;
changes;
}
其中saveparams是用来记录配置文件中配置的条件信息,即bgsava执行的条件。
dirty和lastsave保存服务器实际执行情况,dirty是一个计数器,用来记录执行次数,lastsave记录上一次bgsave执行成功的时间。
redis的serverCron函数,默认每隔100毫秒,通过dirty和lastsave根据saveParams判断一次是否执行bgsave,如果条件满足就执行,执行成功后,dirty和lastsave重新初始化。