RDB持久化与AOF持久化可以同时存在,但重启时,AOF文件会被优先用于恢复数据。
RDB持久化
RDB文件是压缩过的二进制文件,用于保存和还原Redis服务器所有数据库中的所有键值对数据。
SAVE命令由服务器进程直接执行,是阻塞的命令;BGSAVE由子进程(注意不是子线程)执行保存,不会阻塞服务器。
服务器状态中会保存所有save选项设置的保存条件,当任意一个保存条件被满足时,BGSAVE会被自动执行。
不同类型的键值对在RDB文件中以不同的形式保存。
AOF持久化
AOF文件保存所有修改过数据库的写命令记录数据库状态,所有命令都以Redis命令请求协议的格式保存。
为了避免频繁IO,命令请求会先保存在AOF缓冲区里,之后再定期写入AOF文件。
由于AOF文件的模式,随时间增加,AOF文件体积会逐渐增大,因此Redis提供了AOF重写功能,实际上来说,该功能是通过读取数据库中的键值对反向获得命令实现,其体积更小,状态一致。
后台重写AOF文件过程:
在AOF文件重写时,服务器会维护一个AOF重写缓冲区,在子进程创建新的AOF文件期间,记录服务器执行的所有写命令,当子进程完成AOF文件的生成后,将重写缓冲区内的所有内容追加到新的AOF文件末尾,此时服务器进程是阻塞的,不会产生新内容,待完成后,将新的AOF文件替换旧的文件,完成重写操作。