Redis的AOF持久化原理,搞定面试!

211 阅读3分钟
原文链接: mp.weixin.qq.com

(👆点击上面的公众号,可快速关注哦!👆)

在上一篇的文章《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的设计与实现》黄建宏著

👇想获取更多的有价值的内容请关注,进阶的道路上,一起同行👇