(👆点击上面的公众号,可快速关注哦!👆)
在上一篇的文章《Redis的RDB持久化的那些事儿,你懂吗?》中提到Redis持久化中的一个,除了RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能。
什么是AOF?
AOF与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令 来记录数据库状态的,如图-1所示。

图-1
例如在一个空白数据库中,我们有以下操作:
redis> SET key1 "value1"
OK
redis>SADD colors "blue" "white" "yellow"
OK
redis>RPUSH numbers 110 119 120
OK
此时数据库中有了三个值,分为为 key1、colors、numbers。RDB持久化的方式是将这三个键所对应的值保存在文件中,以压缩2进制的形式进行存放。而AOF保存数据库的方法则是将服务器执行的SET、SADD、RPUSH三个命令保存到AOF中。
被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的。服务器启动时,可以通过载入和执行AOF文件中保存的命令 来还原服务器关闭之前的数据库状态。
AOF持久化的实现原理
aof持久化功能的实现可以分为命令追加、文件写入与同步 。
命令追加
当AOF持久化功能个处于打开状态时,服务器在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾。
例如:
redis>SET KEY VALUE
OK
那么服务器在执行这个SET命令之后,会将请求协议格式的命令追加到aof_buf缓冲区的末尾。
文件写入与同步
Redis服务器中有一个定时函数来负责将aof_buf缓冲区的内容写入AOF文件。定时函数将缓冲区数据写入AOF文件的方式,是由Redis所提供的appendsync配置选项。appendsync可能的值如下:
-
always 每一次写操作都会调用一次fsync,这时数据是最安全的,当然,由于每次都会执行fsync,所以其性能也会受到影响。
-
everysec Redis会默认每隔一秒进行一次fsync调用,将缓冲区中的数据写到磁盘。但是当这一 次的fsync调用时长超过1秒时。Redis会采取延迟fsync的策略,再等一秒钟。也就是在两秒后再进行fsync,这一次的fsync就不管会执行多长时间都会进行。这时候由于在fsync时文件描述符会被阻塞,所以当前的写操作就会阻塞。
-
no 当设置appendfsync为no的时候,Redis不会主动去将AOF日志内容同步到磁盘,所以这一切就完全依赖于操作系统。对大多数Linux操作系统,是每30秒进行一次文件同步,将缓冲区中的数据写到磁盘上。
如果用户没有主动为appendsync选项设置值,那么appendsync选项的默认值为everysec。
资料参考: 《Redis的设计与实现》黄建宏著
👇想获取更多的有价值的内容请关注,进阶的道路上,一起同行👇
