AOF持久化

257 阅读2分钟

这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

AOF

RDB持久化通过保存数据库中的键值对来记录数据库,AOF(append only file)通过保存redis服务器所指向的写命令来记录数据库状态

被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的,redis命令请求协议是纯文本格式

AOF持久化的实现

命令追加 文件写入和文件同步三个步骤

1. 命令追加

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

2. 文件写入与同步

Redis服务器进程是一个事件循环,这个循环中文件事件负责接收客户端的命令请求,以及向客户端发送命令回复,服务器结束一个事件循环之前,调用flushAppendOnlyFile函数将aof_buf中的内容写入和保存到AOF文件中,通过配置appendfsync选项的值

/* Append only defines 
 *
 * AOF 的保存频率
 */
#define AOF_FSYNC_NO 0
#define AOF_FSYNC_ALWAYS 1
#define AOF_FSYNC_EVERYSEC 2

appendfsync值有三种:

always:将aof_buf缓冲区的所有内容写入并同步到AOF文件,这个效率很慢但最安全,及时出现故障,也只会丢失一个事件循环产生的命令数据。

everysec:将aof_buf缓冲区中的所有内容写入到AOF文件,如果距离上次同步AOF文件超过一秒,那么再次对AOF文件同步,同步操作由一个线程专门负责执行。每隔一秒在子线程中对AOF文件进行同步,如果出现故障,也只丢失一秒钟的命令数据。

no:将aof_buf缓冲区中的所有内容写入到AOF文件,并不对AOF文件进行同步,何时同步由操作系统决定。使用no模式的服务器将会丢失上一次同步AOF文件之后的所有写命令数据。

默认属性值为everysec