AOF
AOF是Redis的一种持久化方式,另一种是RDB。AOF通过追加写命令到文件实现持久化存储,Redis需要恢复的数据,按顺序逐条执行文件中的命令来实现恢复。
追加写命令到AOF文件
Redis执行完写命令后,把命令添加到aof_buf缓冲区中,在下一次事件轮询开始前(或者定时任务)根据指定的策略,把aof_buf缓冲区的命令写入到文件,刷新到磁盘。
appendfsync always 总是把缓冲区的数据写入文件并调用系统的fsync方法刷新到磁盘
appendfsync everysec 把缓冲区的数据写入文件,每秒执行一次fsync方法刷新到磁盘
appendfsync no 把缓冲区的数据写入文件,不会主动调用fsync方法刷新到磁盘,交由操作系统处理
第一:执行完写命令后,把命令添加到aof_buf缓冲区中:
第二:根据指定的策略,把aof_buf缓冲区的命令写入到文件,刷新到磁盘
AOF重写
随着写命令不断累积,AOF文件会不断地增长,这时候Redis会执行重写,合并一些命令,举个例子,连续多条incr key命令,最终都可以合并成一条set key num的命令,大大地减少AOF文件的大小。同时,命令减少了,也可以提高Redis恢复的速度。
如何重写
AOF重写,是通过把Redis内存中的数据“翻译”成一条条命令写入到新AOF文件,而不是拿旧的AOF文件做文章,那如何“翻译”呢,看源码说事。
启动一个子进程,有子进程执行AOF文件重写
重写过程如何处理新到达的写命令
重写过程中,父进程会继续接收客户端命令,并把新的命令通过管道发送给子进程。
重写完成后
子进程重写完AOF文件后,就退出,由父进程做收尾的工作,例如:在子进程重写的最后会要求父进程停止发送最新命令,这之后AOF重写缓冲区还存在或者又积累了客户端发送过来的新命令,这些都由父进程来重写到新的AOF文件。