跳至主要內容

Redis AOF

blacklad大约 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 重写缓冲区,解决在重写过程中父进程处理的写命令。

  1. 执行客户端命令。
  2. 执行后的写命令追加到 AOF 缓冲区中(保证原有的aof处理工作正常进行)。
  3. 执行后的写命令追加到 AOF 重写缓冲区中。
  4. 当子进程处理完成后,会将 AOF 重写缓冲区中的内容写入到新 AOF 文件中,这是新ao AOF 保存的数据状态和服务器当前的数据状态一直。
  5. 对新的 AOF 文件改名,原子的覆盖旧的 AOF 文件,完成替换。
上次编辑于:
贡献者: blacklad