redis是一个内存数据库,数据库的状态被存储在内存中。但是这就存在一个问题:如果没存在磁盘中,一但将服务器关闭,就会使得服务器中的数据库状态消失。为了解决这样的问题,Redis提供了RDB持久化功能,将内存中的数据库状态保存到磁盘中,当服务器关闭,数据库状态也不会意外丢失。
RDB持久化功能会生成一个压缩了的二进制文件、RDB文件。这个文件保存着生成RDB文件时的数据库状态,当需要时,RDB文件可以被还原为数据库状态。这样就实现了在Redis数据库服务器退出时,只要生成了RDB文件,下一次开启时,仍然能够使用生成RDB文件服务器保存的数据库状态。
一,创建和载入RDB文件
生成RDB文件有两种触发机制:手动触发和自动触发。
手动触发:使用命令SAVE或者BGSAVE。
自动触发:根据服务器配置选项定期执行。
save 900 1 //服务器在900秒之内,对数据库执行了至少1次修改
save 300 10 //服务器在300秒之内,对数据库执行了至少10修改
save 60 1000 //服务器在60秒之内,对数据库执行了至少1000修改
// 满足以上三个条件中的任意一个,则自动触发 BGSAVE 操作
// 或者使用命令CONFIG SET 命令配置
生成RDB文件的命令有两个:一个是SAVE另一个是BGSAVE。
1.1、save命令
1,SAVE命令生成RDB文件:
SAVE命令生成RDB文件时,会阻塞服务器进程,只有RDB文件生成后结束才能继续执行其他命令。
2,SAVE实现源代码://代码来源:https://github.com/menwengit/redis_source_annotation/blob/master/rdb.c
// SAVE 命令实现
void saveCommand(client *c) {
// 如果正在执行持久化操作,则退出
if (server.rdb_child_pid != -1) {
addReplyError(c,"Background save already in progress");
return;
}
// 执行SAVE
if (rdbSave(server.rdb_filename) == C_OK) {
addReply(c,shared.ok);
} else {
addReply(c,shared.err);
}
}
1.2、BGSAVE
1、BGSAVE命令生成RDB文件: