AOF文件的写入与同步

在 Redis 中客户端向服务器发送相关写命令请求,这时服务器中有个用于处理这些命令的事件循环进程,对这些命令进行处理,并将相关信息处理的结果反馈给客户端,如:"OK",等。同时,在这个期间,服务器中命令请求器会将相关写命令追加到 aof_buf 缓冲区和 aof_rewrite_buf 重写缓冲区。

这个阶段服务器进程会处理这三个操作:

(1)执行客户端的命令。

(2)将执行后的写命令 append 入 aof_buf 中。

(3)将执行后的写命令 append 入 aof_rewrite_buf 中。

 图 1 写命令追加到缓冲区中

当进行 AOF持久化的时候,对于 aof_buf 中的数据需要写入并同步到 appendonly.aof 文件中。

图 2  AOF持久化 

是否将 aof_buf 缓冲区中内容写入AOF文件中,由 redis.conf 配置文件中的 appendfsync 设置的值来决定,通过 flushAppendFile 函数来进行相关操作。

//事件轮询函数
def evenloop():
  while True:
       ........
    //是否将 aof_buf 缓冲区中的内容写入并同步到 appendonly.aof 文件中。
       flushAppendOnlyFile()

 

         appendfsync 选项的值                                          flushAppendOnlyFile 函数的行为
always 将 aof_buf 缓冲区中的所有内容写入并同步到 AOF 文件中(最安全,但性能差)
everysec 将 aof_buf 缓冲区中的所有内容写入并同步到 AOF 文件中,如果上次同步 AOF 文件的时间距离现在超过 1 秒钟,那么会再次对 AOF 文件进行同步。 (安全,性能较好)

no

将 aof_buf 缓冲区中的所有内容写入并同步到 AOF 文件中,但不对 AOF 文件进行同步,何时进行同步一般有操作系统来决定。(一般为 30 秒,不安全,性能最好)

对于操作系统来说,为了提高对文件的写入操作,一般都是等缓冲区满了或者设置了同步时间,才会将内存缓冲区中的数据写入到磁盘中,完成相关持久化工作。这就可以把写入操作比作把东西写到文本中,同步比作保存。如果没有进行保存,计算机宕机之后,写入文本中的数据会全部丢失。而对于 Redis 来说,要将缓冲区中的数据同步到 aof 文件中,才能避免 Redis 突然宕机后,进行相关数据信息的恢复操作。

 

posted @ 2020-06-12 18:54  _BKing  阅读(1157)  评论(0编辑  收藏  举报