AOF 和 RDB 两种技术都会用各用一个日志文件来记录信息,但是记录的内容是不同的。
RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据,而 AOF 文件记录的是命令操作的日志,而不是实际的数据。
因此在 Redis 恢复数据时, RDB 恢复数据的效率会比 AOF 高些,因为直接将 RDB 文件读入内存就可以,不需要像 AOF 那样还需要额外执行操作命令的步骤才能恢复数据。
生成 RDB 文件有两种方式,分别是:
save
命令:在主线程生成 RDB 文件,会阻塞主线程bgsave
命令:在子进程生成 RDB 文件,同时使用写时复制技术来避免主线程的阻塞RDB 持久化方式同样使用到了 AOF 中提到的「写时复制技术」,执行 bgsave 命令的时候,会通过 fork()
创建子进程,此时子进程和父进程是共享同一片内存数据的,因为创建子进程的时候,会复制父进程的页表,但是页表指向的物理内存还是一个。
只有在发生修改内存数据的情况时,物理内存才会被复制一份。
<aside> 💡 bgsave 快照过程中,如果主线程修改了共享数据,发生了写时复制后,RDB 快照保存的是原本的内存数据,而主线程刚修改的数据,是没办法在这一时间写入 RDB 文件的,只能交由下一次的 bgsave 快照。
</aside>