Redis 内存快照简介

93 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。


内存快照是什么

内存快照是除 AOF 日志之外,Redis 提供的另外一种持久化方案。它保存的是内存中数据在某一个特定时刻的状态。与 AOF 日志相比,当 Redis 需要恢复数据的时候,通过内存快照恢复的速度会比 AOF 日志更快,对整个系统的影响更小。

内存快照产生的文件叫 RDB 文件,RDB 是 Redis DataBase 的缩写。

Redis 提供了两种方式生成 RDB 文件:

  • save:在主线程中执行,会造成阻塞
  • bgsave(默认方式):创建一个子线程来写 RDB 文件,不会造成阻塞。

创建快照时如何处理数据修改

当使用子线程创建内存快照的时候,主线程还在处理数据操作,因为创建开招需要时间,这个时候就需要有一种机制来确保快照中写入的是内存中所有数据在同一个时刻的状态,避免把创建快找过程中发生的数据变动也写入。

Redis 借助了操作系统的 COW(Copy-On-Write,写时复制)的技术。Bgsave 子进程通过 fork 主线程产生,共享主线程所有的数据。当主线程需要修改某块数据的时候,这块数据就会被复制一份,然后在复制好的副本上进行修改。这样 bgsave 子进程读取并写入快找文件的依然是修改前的数据。等快找创建完之后,主线程在使用经过修改的复制的副本数据替代之前的数据就可以了。

要注意,虽然 bgsave 不会阻塞住线程,但是,通过 fork 操作创建 bgsave 子进程的时候,主线程是阻塞的。而且,进行快照创建需要考虑磁盘写入的压力。因此,快照创建不宜过于频繁。

AOF 日志和内存快照的对比

  • 如果只是用内存快照,一旦宕机,可能会有分钟级别的数据丢失。
  • 如果只是用 AOF 日志,everysec 的选项是一个安全和性能之间的平衡选择。
  • 如果想最大程度低兼顾安全和性能,可以考虑内存快照和 AOF 日志结合使用。Redis 4 之后的版本支持混合使用 AOF 和内存快照的方法,简单讲就是,定时做内存快照,而在两次快照之间的数据使用 AOF 日志来记录。