一、内存快照
1、指内存中的数据在某一个时刻的状态记录,可实现快速恢复
2、RDB 就是 Redis DataBase 的缩写,即数据可靠性
二、给哪些内存数据做快照?
1、为了提供所有数据的可靠性保证,它执行的是全量快照,也就是说,把内存中的所有数据都记录到磁盘中
2、Redis 提供了两个命令来生成 RDB 文件,分别是 save 和 bgsave
A、save:在主线程中执行,会导致阻塞;
B、bgsave:创建一个子进程,专门用于写入 RDB 文件,避免了主线程的阻塞,这也是 Redis RDB 文件生成的默认配置
3、通过 bgsave 命令来执行全量快照,这既提供了数据的可靠性保证,也避免了对 Redis 的性能影响
三、快照时数据能修改吗
1、在进行bgsave时,主线程没有阻塞,可以正常接收请求,但是,为了保证快照完整性,主线程只能处理读操作,不能修改正在执行快照的数据。
2、Redis 借助操作系统提供的写时复制技术(Copy-On-Write, COW),在执行快照的同时,正常处理写操作
A、如果主线程对这些数据也都是读操作(例如图中的键值对 A),那么,主线程和 bgsave 子进程相互不影响。
B、但是,如果主线程要修改一块数据(例如图中的键值对 C),那么,这块数据就会被复制一份,生成该数据的副本(键值对 C’)。然后,主线程在这个数据副本上进行修改。同时,bgsave 子进程可以继续把原来的数据(键值对 C)写入 RDB 文件。
四、可以每秒做一次快照吗?
1、增量快照
A、做了一次全量快照后,后续的快照只对修改的数据进行快照记录,这样可以避免每次全量快照的开销
五、RDB的缺点
1、虽然跟 AOF 相比,快照的恢复速度快,但是,快照的频率不好把握,如果频率太低,两次快照间一旦宕机,就可能有比较多的数据丢失。如果频率太高,又会产生额外开销
六、混合使用 AOF 日志和内存快照
1、内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作
七、建议
1、数据不能丢失时,内存快照和 AOF 的混合使用是一个很好的选择;
2、如果允许分钟级别的数据丢失,可以只使用 RDB;
3、如果只用 AOF,优先使用 everysec 的配置选项,因为它在可靠性和性能之间取了一个平衡。