RDB方式实际是将redis中的所有键值对保存为二进制文件,该文件可以还原为某一时刻特定的数据库状态。
SAVE命令会阻塞redis服务器进程,直到rdb文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求,而bgsave命令会派生出一个子进程,由子进程创建rdb文件。
可以通过设置save选项设置bgsave执行的条件,redis的周期性操作函数serverCron会每隔100毫秒检查save条件是否满足,一旦满足就执行bgsave。
AOF持久化是通过保存redis服务器所执行的写命令来记录数据库状态的。服务器只要读入并重新执行一遍AOF文件里保存的所有写命令,就可以还原数据库。
AOF持久化的实现:1. 命令追加到缓冲区;2. 当事件循环到来时如果满足写入条件(服务器配置)则将缓冲区写入aof文件。
随着时间推移redis执行的写命令会越来越多,aof文件会越来越大,redis通过aof重写机制避免aof文件急剧膨胀。aof重写是通过子进程读取数据库状态来实现的。在子进程进行aof重写期间,新的写命令保存在aof重写缓冲区内,在aof重写执行完后将重写缓冲区的内容保存到新的aof文件中。
两种备份方案的选择:对于RDB持久化,一方面是bgsave在进行fork操作时Redis主进程会阻塞,另一方面,子进程向硬盘写数据也会带来IO压力,但数据的完整性和一致性受备份条件影响可能较差;而AOF持久化由于持续的写入IO压力更大,但数据的一致性和完整性较好。