redis持久化之AOF持久化

Posted juin1058

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis持久化之AOF持久化相关的知识,希望对你有一定的参考价值。

AOF与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,aof持久化是通过保存redis服务器所执行的写命令来记录数据库状态的。被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的。

1.AOF持久化的实现

AOF持久化的实现可以分为命令追加(append),文件写入,文件同步(sync)三个步骤。

1.1 命令追加

当AOF持久化功能处于打开状态,服务器在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区末尾:

struct redisServer{
//...
//AOF缓冲区
sds aof_buf
//...
};

例如 redis>SET KEY VALUE

那么服务器在执行这个set命令之后,会将以下协议内容追加到aof_buf缓冲区的末尾:

*3 $3 SET $3 KEY $5 VALUE

1.2 AOF文件的写入与同步

redis服务器进程就是一个事件循环(loop),这个循环中的文件事件负责接收客户端的命令请求,以及向客户端发送命令回复,而时间事件则负责执行像serverCron函数这样需要定时运行的函数。

因为服务器在处理文件事件时可能会执行写命令,使得一些内容被追加到aof_buf缓冲区里面,所以在服务器每次结束一个事件循环之前,它都会调用flushAppendOnlyFile函数,考虑是否需要将

aof_buf缓冲区的内容写入和保存到AOF文件里面。

def eventLoop():
while true:
//处理文件事件,接收命令请求以及发送命令回复
//处理命令请求时可能会有新内容被追加到aof_buf缓冲区
processFileEvents()
//处理时间事件
processTimeEvents()
//考虑是否将aof_buf中的内容写入和保存到AOF文件里面
flushAppendOnlyFile()

flushAppendOnlyFile函数的行为由服务器配置的appendfsync选项的值来决定,各个不同值产生的行为如下表所示:

技术图片

appendfsync默认值是everysec,可以参考redis.conf配置文件

 

 

以上是关于redis持久化之AOF持久化的主要内容,如果未能解决你的问题,请参考以下文章

redis持久化之AOF持久化

redis 简单整理——持久化之AOF[二十]

redis源码阅读-持久化之aof详解

Redis源码剖析 - Redis持久化之AOF

Redis源码剖析 - Redis持久化之AOF

redis持久化之AOF