Redis的AOF与RDB

时间:2021-12-09 18:33:40

AOF持久化的实现

AOF持久化的实现可以分为命令追加、文件写入和文件同步三个步骤。

struct redisServer {
    sds aof_buf;/* AOF buffer, written before entering the event loop */
}

AOF持久化功能处于打开状态时,服务器在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾.

AOF重写

Redis提供了AOF重写功能:Redis服务器可以创建一个新的AOF文件来替代现有的AOF文件,新旧两个文件所保存的数据库状态是相同的,但是新的AOF文件不会包含任何浪费空间的冗余命令,通常体积会较旧AOF文件小很多。 由于AOF重写是会进行大量写写入操作,势必为长时间阻塞主进程,因此redis把重写程序放到子进程执行。

这样做有两点好处:

  1)子进程重写期间,主进程可以继续处理命令。

  2)子进程带有主进程的数据副本,这样就可以避免与主进程竞争db->dict,这是线程实现不了的。

  重写期间,主进程继续处理命令,对数据库状态进行修改,这样使得当前的数据库状态与重写的AOF文件

所保存的数据库状态不一致。因此,redis设置了AOF重写缓冲区,在创建子进程后,主进程每执行一个写命令都会写到重写缓冲区。在子进程完成重写后,主进程会将AOF重写缓冲区的数据写入到重写的AOF文件,保证数据状态的一致。

RDB持久化

RDB的持久化方式是将内存数据以快照的形式写入磁盘文件,并在Redis启动的时候,通过此文件恢复内存数据的状态。

使用sava语句可能会阻塞主线程,所以使用bgsave