浅谈AOF持久化
AOF (Append Only File) 持久化
不同于RDB,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。
实现方式
AOF持久化功能的实现可以分为 命令追加(append)、文件写入、文件同步(sync)三个步骤。
命令追加
当AOF持久化功能处于打开状态时,服务器在执行完一个命令后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾
文件写入
Redis的服务器进程是一个事件循环(loop),在每个事件循环结束的时候,会将aof_buf缓冲区的所有内容写入到AOF文件中
这里要注意一个常识,写入并不等于同步(数据仍然可能丢失):
文件同步
通过服务器配置的appendfsync选项来决定了,同步aof文件的行为:
-
设置为
always时,在事件循环结束时,aof_buf缓冲区写入aof文件的同时,会同步aof文件,保证数据落入磁盘。 -
设置为
everysec时,在事件循环结束时,会检查上次进行aof文件同步的时间,如果超过了1s,则同步aof文件,保证数据落入磁盘。 -
设置为
no时,redis不会主动去同步aof文件,只是做aof文件的写入,何时同步交由操作系统决定。
数据什么情况下会丢失?
很显然,因为是在事件循环结束时,才会把aof_buf缓冲区内容写入aof文件,所以不论appendfsync设置的是哪种模式,redis在宕机情况下,都有丢数据的风险。区别点如下:
- 设置成
always的时候,会丢失这一个事件循环里的redis数据。 - 设置成
evenrysec则会丢失1s内的数据(因为这1s内并没有进行aof文件同步,只是做了写入)。 - 设置成
no时,会丢失自上次同步aof文件后的数据。

浙公网安备 33010602011771号