https://www.lizenghai.com/archives/133796.html
在 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 突然宕机后,进行相关数据信息的恢复操作。