Redis AOF
大约 2 分钟RedisRedisRedis 设计与实现
Redis AOF
AOF (Append Only File ) 持久化是通过保存服务器执行的写命令来记录数据库状态的。

1 实现
1.1 命令追加
当服务器执行完写命令之后会以写一个是将被执行的写命令追加到服务器状态的 aof_buf
缓冲区末尾。
1.2 文件写入
Redis 服务器就像一个事件循环,这个循环中的文件事件负责接收客户端的命令请求,以及向客户端发送命令恢复,因为执行事件时可能会执行写命令,内容被追加到aof_buf缓冲区里面,每次结束一个事件循环之前都会调用 flushAppendOnlyFile
函数将 aof_buf
缓冲区中的内容写入和保存到 AOF
文件里面。
1.2.1 伪代码表示

flushAppendOnlyFile
的不同行为配置:

三种参数都会在每个事件结束后写入, 但同步的策略不同。
2 AOF 重写
为了解决 AOF
文件体积不断膨胀的问题,redis提供了文件重写的功能,创建一个新的 AOF
文件,不包括冗余的命令,但新旧两个 AOF
文件所保存的数据库状态相同。
实现原理
不是通过读取分析旧的aof文件,而是通过读取当前状态的服务器,生成新的命令。
// 执行命令
RPUSH list 'A'
RPUSH list 'B'
RPUSH list 'C'
RPUSH list 'D'
LPOP list
// 重新生成命令
RPUSH list 'B' 'C' 'D'
后台重写
由于 AOF
重写文件会进行大量的写入操作,所以 Redis 将 AOF
重写程序放入到子进程里面执行。子进程进行 AOF
重写,父进程可以继续处理命令请求,且子进程保存的是父进程的副本,可以保证数据 的安全性。
Redis定义了 AOF
重写缓冲区,解决在重写过程中父进程处理的写命令。

- 执行客户端命令。
- 执行后的写命令追加到
AOF
缓冲区中(保证原有的aof处理工作正常进行)。 - 执行后的写命令追加到
AOF
重写缓冲区中。 - 当子进程处理完成后,会将
AOF
重写缓冲区中的内容写入到新AOF
文件中,这是新aoAOF
保存的数据状态和服务器当前的数据状态一直。 - 对新的
AOF
文件改名,原子的覆盖旧的AOF
文件,完成替换。