AOF日志

Redis 的持久化主要有两大机制,即 AOF(Append Only File)日志和 RDB 快照。AOF是写后日志,先执行命令再记录日志。这样就不会存在命令错误和阻塞当前写操作了。

风险:

  • 如果刚执行完一个命令,还没有来得及记日志就宕机了,那么这个命令和相应的数据就有丢失的风险。
  • AOF 虽然避免了对当前命令的阻塞,但可能会给下一个操作带来阻塞风险。

写回磁盘策略:

  • Always:同步写回:每个写命令执行完,立马同步地将日志写回磁盘;

  • Everysec:每秒写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘;

  • No:操作系统控制的写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘。

    image-20230416170054636

AOF重写机制:

AOF会随着命令越来越多而变大,这个时候就需要对AOF进行重写。重写机制具有“多变一”功能。旧日志文件中的多条命令,在重写后的新日志中变成了一条命令。

和 AOF 日志由主线程写回不同,重写过程是由后台子进程 bgrewriteaof 来完成的,这也是为了避免阻塞主线程,导致数据库性能下降。

  • 重写过程:

    每次 AOF 重写时,Redis 会先执行一个内存拷贝,用于重写;然后,使用两个日志保证在重写过程中,新写入的数据不会丢失(AOF重写缓冲会在重写完成后写入新的AOF文件中)。而且,因为 Redis 采用额外的线程进行数据重写,所以,这个过程并不会阻塞主线程。

    image-20230416170447838