不同于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文件后的数据。原文:https://www.cnblogs.com/hustle/p/14018892.html