AOF(Append Only File)
对比 RDB:
- RDB 通过保存当前数据库中 键值对数据 实现持久化。
- AOF 通过保存服务器执行的 写命令 实现持久化。
AOF 持久化功能,分为:命令追加、文件写入、文件同步。
AOF 命令追加
当 AOF 功能打开时,服务器执行写命令之后,将命令按照一定的协议格式添加到 redisServer 结构的 aof_buf 缓冲区。
AOF 文件写入和同步
操作系统中,写入文件的数据暂时被保存在内存缓冲区,达到一定条件时,才会将缓冲区内容正式写入到文件。
Redis 时间循环与 AOF 文件写入(伪代码):
while True:
# 处理文件事件,接受客户端命令请求和发送命令回复
# 处理请求命令,有可能会将命令写入到 aof_buf 缓冲区
procssFileEvents()
# 处理时间事件
processTimeEvents()
# 判断是否将 aof_buf 缓冲区内容写入和保存的 AOF 文件里面
flushAppendOnlyFile()
flushAppendOnlyFile 函数的行为由服务器配置的 appendfsync 选项的值决定:
- always:将 aof_buf 缓冲区中的所有内容写入并同步到 AOF 文件。
- everysec:将 aof_buf 缓冲区的所有内容写入,并开启线程每个一秒执行同步 AOF 文件操作。
- no:将 aof _bug 缓冲区的所有内容写入,但不对 AOF 文件进行同步操作,由操作系统决定合适同步。
AOF 重写
随着时间的流逝,AOF 文件体积越来越大,还原数据的时间越来越多;Redis 通过 AOF 重写,将冗余的,浪费空间的冗余命令。
AOF 重写的实现
通过读取服务器当前的数据库状态来实现的,而不是通过分析 AOF 文件。
在执行 BGREWRITEAOF 命令时,Redis 服务器会维护一个 AOF 重写缓冲区,该缓冲区会在子进程创建新 AOF 文件期间,记录服务器执行的所有命令。当子进程创建新 AOF 文件之后,服务器会将缓冲区中的所有内容追加到新 AOF 文件的末尾,使得新旧两个 AOF 文件保存的数据库状态一致。最后,服务器用新的 AOF 文件替换旧的 AOF 文件,以此来完成 AOF 文件重写操作。