因为redis是内存数据库,它将自己的数据库状态储存在内存里面,如果服务器进程退出,服务器的数据库状态就会消失不见。为了解决这个问题,redis提供了rdb持久化,这个功能就是将redis在内存的数据库状态存到磁盘里。
一.RDB文件的创建与载入
1.1 RDB文件的创建
redis有两个命令用于创建RDB文件,分别是SAVE 和 BGSAVE.
SAVE命令会阻塞当前服务器进程,知道RDB文件创建完成为止,期间redis服务器不接受任何其他命令;
BGSAVE命令不会阻塞当前服务器进程,而是通过fork一个子进程,由这个子进程来创建RDB文件,服务器进程继续执行命令。
1.2 RDB文件的载入
RDB文件载入并没有命令去执行,它是在每次服务器启动的时候,只要检测到RDB文件的存在,就会去载入。
需要注意的是,如果服务器开启了AOF持久化,优先用AOF文件来加载,如下图所示:
前面提到过,当save命令执行时,redis服务器会被阻塞,所以当save命令正在执行时,客户端发送的所有命令请求都会被拒绝。只有服务器在执行完save命令,重新开始接受命令请求之后,客户端
发送的命令才会被处理。
而bgsave命令在执行时,redis服务器还会继续处理客户端的命令请求,但是在bgsave命令执行期间,服务器处理save,bgsave,bgrewriteaof三个命令的方式和平时会有点不同。
1.bgsave命令执行期间,客户端发送的save命令会被拒绝
2.bgsave命令执行期间,客户端发送的bgsave命令会被拒绝
3.最后bgrewriteaof和bgsave不能同时执行,如果bgrewriteaof正在执行,客户端发送的bgsave命令会被服务器拒绝,如果basave正在执行,那么客户端发送的BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕之后执行。
1.3 RDB文件载入时的服务器状态
服务器在载入rdb文件期间,会一直处于阻塞状态,直到载入工作完成为止。
1.4 自动间隔性保存
redis允许用户通过设置服务器配置的save选项,让服务器每个一段时间自动执行一次BGSAVE命令。比如:
save 900 1
save 300 10
save 60 10000