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\r\n$3\r\nSET\r\n$3\r\nKEY\r\n$5\r\nVALUE\r\n
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配置文件
原文地址:https://www.cnblogs.com/juin1058/p/11640705.html
时间: 2024-10-08 02:10:20