与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的谢明令来记录数据库状态的。
AOF持久化功能的实现可以分为3个部分:
- 命令追加
- 文件写入
-
文件同步
AOF有3种不同的持久化行为:
image.png
AOF文件的载入与数据还原是通过创建一个不带网络连接的伪客户端,然后伪客户端执行AOF文件中的写命令,来实现数据库状态的还原。
为了解决AOF文件体积膨胀的问题,Redis提供了AOF文件重写的功能,通过创建新的AOF来替代旧的AOF。
AOF重写的原理是通过读取服务器当前的数据库状态来实现的。
AOF后台启动一个新的子进程执行重写操作,但是可能会存在重写后的AOF文件和当前数据库状态不一致的情况,因此,使用AOF重写缓冲区,将子进程开始执行AOF重写的时候,记录这期间Redis服务器执行的写记录,当子进程的AOF文件重写完成后,会发送一个信号给父进程,父进程会调用一个信号处理函数,并将AOF重写缓冲区的内容追加到新的AOF文件末尾,用新的AOF文件覆盖就的AOF文件,既完成了AOF文件的后台重写操作,注意,信号处理函数执行期间服务器进程是阻塞的,为了保证AOF文件和数据状态的一致性。
上述即BGREWRITEAOF命令的实现原理。
![](https://img.haomeiwen.com/i13526929/02a6a9a0f96c961f.png)
网友评论