AOF持久化

  AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的;服务器在启动时,可以通过载入和执行AOF文件中保存的命令来还原服务器关闭之前的数据库状态。被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的,因为Redis的命令请求协议是纯文本格式,所以我们可以直接打开一个AOF文件,观察里面的内容。

一、AOF持久化的实现
1. 命令追加
  服务器在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的“aof_buf“缓冲区的末尾。

2. AOF文件的写入与同步
  Redis的服务器进程实际上就是一个事件循环,每次结束一个事件循环之前,服务器都会检查是否需要将”aof_buf“缓冲区中的内容写入并同步到AOF文件中,其规则由配置参数"appendfsync"配置:

二、AOF文件的载入与数据还原
  使用AOF文件进行数据还原的步骤如下:
(1)创建一个不带网络连接的伪客户端;
(2)从AOF文件中分析并读取出一条写命令;
(3)使用伪客户端执行被读出的写命令;
(4)一直执行步骤2和步骤3,直到AOF文件中的所有写命令都被处理完毕为止。

三、AOF重写
  随着Redis服务器的运行,AOF文件的体积会越来越大,可能会对Redis服务器造成影响,而且使用AOF文件进行数据还原所需的时间也会越来越多。为了解决这个问题,Redis提供了AOF文件重写功能,创建一个新的AOF文件来替代现有的AOF文件,新的AOF文件不包含冗余命令,体积比原来的AOF文件小很多。
1. AOF文件重写的实现
  AOF文件重写并不需要对现有的AOF文件进行任何读取、分析或者写入操作,而是通过读取服务器当前的数据库状态来实现的。实现原理:首先从数据库中读取键现在的值,然后用一条命令去记录键值对,代替之前记录这个键值对的多条命令。(遍历redis所有数据库,遍历每个非空数据库中所有的键,忽略已过期的键,根据键类型对键进行重写,如果键带有过期时间,过期时间也要被重写。)
  重写后的AOF文件只包含还原当前数据库状态所必须的命令,所以新的AOF文件不会浪费任何磁盘空间。

2. AOF后台重写
  由于AOF文件重写会进行大量的写入操作,导致服务器线程阻塞,无法处理客户端请求。为了解决这个问题,Redis服务器使用子进程来进行AOF文件重写。
  在子进程重写AOF文件期间,服务器在处理客户端请求过程中有可能会执行写命令,这会导致当前的数据库状态和重写后的AOF文件所保存的数据库状态不一致。为了解决这个问题,Redis服务器会在子进程开始重写AOF文件的时候启用AOF重写缓冲区,这样Redis服务器执行完一个写命令之后,它会同时将这个写命令发送给AOF缓冲区和AOF重写缓冲区。

  这就是AOF后台重写,也即是BGREWRITEAOF命令的实现原理。
  通常情况下,Redis只会将那些对数据库进行了修改的命令写入AOF文件,并复制到各个从服务器。但pubsub命令和script load命令例外,pubsub会改变客户端状态,script load会改变服务器状态,所以服务器需要使用REDIS_FORCE_AOF标志,强制将这两个命令写入AOF文件。

原文地址:https://www.cnblogs.com/wujuntian/p/9251426.html