探索Redis持久化原理( 二 )


优化前set s1 1set s1 2set s1 3优化后set s1 3<br data-filtered="filtered">
AOF文件优化原理
AOF的重写是通过子进程实现的,因此,主线程是继续工作的,有可能对新的数据进行修改,有可能会导致数据库的数据和重写之后的数据不一致 。redis通过增加一个AOF重写缓存来解决这个问题,当fork出子进程之后,新的命令不仅会追加到现有的AOF文件中,还会添加一份数据到这个缓存当中 。
重写过程分析(需要保证从写的操作是绝对安全的)
Redis创建新的AOF文件之后,会继续将命令添加到原有的AOF文件中,即使数据库突然宕机了,原有的AOF文件和文件内容也不会有损失 。而当新的AOF文件创建完毕之后,会直接把旧的替换掉,往新的AOF文件中添加命令 。
当子进程在进行重写时,主进程会完成下列工作

  • 处理请求,将新的命令继续添加到AOF文件中,同时将命令添加到AOF重写缓存中 。保证数据的一致行,避免出现数据丢失 。
  • 当子进程重写完毕之后会向主进程发送一个完成信号,这时主进程会把重写缓存中的内容添加到新的AOF文件中,这样新的AOF文件,数据库,旧的AOF文件的内容就完全一致了 。然后对新的AOF文件改名,覆盖原有的AOF文件 。
这样程序就完成了新旧AOF文件的替换工作 。而当处理完成之后,主进程就会继续接受请求 。整个重写过程中只有最后的缓存写入和改名替换的操作会导致主进程阻塞,其他时候不会影响redis的正常工作,把AOF重写对redis的性能影响降到最低 。




推荐阅读