RDB日志

AOF日志记录了每条操作的命令,也正因为记录的是操作命令,而不是实际的数据,所以,用 AOF 方法进行故障恢复的时候,需要逐一把操作日志都执行一遍。也正是这个原因,RDB日志内存快照诞生了。

和 AOF 相比,RDB 记录的是某一时刻的数据,执行的是全量快照,并不是操作,所以,在做数据恢复时,我们可以直接把 RDB 文件读入内存,很快地完成恢复。

Redis 提供了两个命令来生成 RDB 文件,分别是 save 和 bgsave。

  • save:在主线程中执行,会导致阻塞;
  • bgsave:创建一个子进程,专门用于写入 RDB 文件,避免了主线程的阻塞,这也是 Redis RDB 文件生成的默认配置。

写时复制技术:

利用写时复制技术,在执行快照的同时,正常处理写操作。

原理就是如果主线程需要对数据进行修改,则会复制一份副本对副本进行修改

image-20230417153832275

小结

AOF日志与RDB日志都有各自的优缺点,没办法做到完全完美。所以Redis 4.0 中提出了一个混合使用 AOF 日志和内存快照的方法。

这样一来,快照不用很频繁地执行,这就避免了频繁 fork 对主线程的影响。而且,AOF 日志也只用记录两次快照间的操作,也就是说,不需要记录所有操作了,因此,就不会出现文件过大的情况了,也可以避免重写开销。

image-20230417154610499