在 Redis 中客户端向服务器发送相关写命令请求,这时服务器中有个用于处理这些命令的事件循环进程,对这些命令进行处理,并将相关信息处理的结果反馈给客户端,如:"OK",等。同时,在这个期间,服务器中命令请求器会将相关写命令追加到 aof_buf 缓冲区和 aof_rewrite_buf 重写缓冲区。python
这个阶段服务器进程会处理这三个操做:redis
(1)执行客户端的命令。安全
(2)将执行后的写命令 append 入 aof_buf 中。服务器
(3)将执行后的写命令 append 入 aof_rewrite_buf 中。app
图 1 写命令追加到缓冲区中函数
当进行 AOF持久化的时候,对于 aof_buf 中的数据须要写入并同步到 appendonly.aof 文件中。oop
图 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 文件进行同步。 (安全,性能较好) |
noblog |
将 aof_buf 缓冲区中的全部内容写入并同步到 AOF 文件中,但不对 AOF 文件进行同步,什么时候进行同步通常有操做系统来决定。(通常为 30 秒,不安全,性能最好) |
对于操做系统来讲,为了提升对文件的写入操做,通常都是等缓冲区满了或者设置了同步时间,才会将内存缓冲区中的数据写入到磁盘中,完成相关持久化工做。这就能够把写入操做比做把东西写到文本中,同步比做保存。若是没有进行保存,计算机宕机以后,写入文本中的数据会所有丢失。而对于 Redis 来讲,要将缓冲区中的数据同步到 aof 文件中,才能避免 Redis 忽然宕机后,进行相关数据信息的恢复操做。