一、AOF
1、AOF文件的载入
服务器在启动时,可以通过载入和执行AOF文件中保存的命令来还原服务器关闭之前的数据库状态
被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的,因为Redis的命令请求协议是纯文本格式。
AOF(AppendOnlyFile)的实现方式
1、命令追加,当AOF持久化功能处于打开状态时,服务器执行完一个命令之后,会以协议格式被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾,缓冲区只是暂时存放,是否加入到aof文件中还要根据具体的配置而定。
2、AOF文件的载入与数据还原
1、创建一个不带网络连接的伪客户端,因为Redis命令只能在客户端的上下文执行
2、从AOF文件中分析并读取出一条写命令
3、使用伪客户端执行被读出的写命令
4、一直执行步骤2和3直到AOF文件所有写命令都被处理完毕
3、AOF文件重写
因为AOF文件的内容会越来越多,为了减少AOF文件越来越大出现了AOF文件重写
通过新的AOF文件来代替现有的AOF文件
文件重写原理:首先从数据库读取键现在的值,然后用一条命令去记录键值对,代替之前记录这个键值对的多条命令,这就是AOF重写功能的实现原理。
因为aof_rewrite函数生成的新AOF文件只包含还原当前数据库状态所必须的命令,因此新AOF文件不会浪费任何硬盘空间。
AOF重写程序放在子进程黎执行有以下好处
1、子进程进行AOF重写期间,服务器进程可以继续处理命令请求
2、子进程带有服务器进程的数据副本,使用子进程可以在避免使用锁的情况下,保证数据的安全性。
AOF重写缓冲区用来解决服务器当前的数据状态和重写后的AOF文件所保存的数据库状态不一致的问题(子进程在进行AOF重写期间,服务器还需要继续处理命令请求,而新的命令可能会对现有的数据库状态进行修改,从而使得服务器当前的数据库状态和重写后的AOF文件所保存的数据库状态不一致),这个缓冲区在服务器创建子进程后开始使用
子进程执行AOF重写期间,服务器进程需要执行一下三个工作
1、执行客户端发来的命令
2、将执行后的写命令追加到AOF缓存区
3、将执行后的写命令追加到AOF重写缓冲区