Redis是一个键值对数据库服务器;
服务器的非空数据库以及其中的键值对统称为“数据库状态”;
Redis是内存数据库,为防止进程退出数据消失,必须将数据库状态持久化到磁盘文件中;
Redis提供RDB持久化功能,可将内存中的数据库状态保存到磁盘中;
RDB持久化既可以手动执行,也可以根据配置服务器的配置选项定期执行,该功能可以将某个时间点上的数据库状态保存到一个RDB文件中;
RDB持久化功能生成的RDB文件是一个经过压缩的二进制文件,服务器在启动时通过加载RDB文件还原数据库状态;
RDB文件的创建与载入
SAVE命令、BGSAVE命令都可用于生成RDB文件;
SAVE命令会阻塞服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间不能处理任何命令请求;
BGSAVE命令会派生出一个子进程,由子进程在后台负责创建RDB文件,服务器进程继续处理命令请求;
创建RDB文件的实际工作是底层的rdb.c/rdbSAVE函数,两个命令会以不同的方式调用该函数;(大致流程:①SAVE命令直接调用该函数进行RDB文件的生成;②BGSAVE命令,则先fork一个子进程,通过子进程调用该函数创建RDB文件,结束后向服务器进程发送信号,服务器进程阻塞处理该信号)
RDB文件的载入工作是在Redis服务器启动时自动执行的,没有专门的命令(服务器在启动时检测到RDB文件时,便自动将其载入)
注:AOF文件的更新频率通常比RDB文件的更新频率高,所以若服务器同时开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据库状态;只有在AOF持久化处于关闭状态时,服务器才会使用RDB文件来还原数据库状态;
SAVE命令执行时的服务器状态
执行SAVE命令的进程将会被阻塞从而无法处理任何命令请求;
BGSAVE命令执行时的服务器状态
BGSAVE命令执行期间,服务器处理SAVE、BGSAVE、BGREWRITAOF三个命令的方式会与平时不同;
- BGSAVE命令执行期间,客户端发送的SAVE命令会被服务器拒绝(服务器进制SAVE命令和BGSAVE命令同时执行是为了避免父进程和子进程同时执行两个rdbSave的调用,防止产生竞争条件)
- BGSAVE命令执行期间,客户端发送的BGSAVE命令会被服务器拒绝,同时执行两个BGSAVE命令也会产生竞争条件;
- BGREWRITEAOF和BGSAVE两个命令不能同时执行:
- 若BGSAVE命令正在执行,则客户端发送的BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕之后再执行;
- 若BGREWRITEAOF命令正在执行,则客户端发送的BGSAVE命令会被服务器拒绝;
BGSAVE与BGREWRITEAOF命令实际工作虽然都由子进程执行,但并无冲突,不同是执行只是出于性能方面的考虑;