RDB
RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发机制有手动和自动。
RDB是一个压缩的二进制文件按,是某一个时间点上的数据快照,适合备份、全量复制,比较适用于灾难恢复。redis加载RDB恢复数据远远快于AOF的方式。
RDB没有办法做到实时持久化(秒级),bgsave每次运行执行fork创建子进程,属于重量级操作,频繁执行成本高。流程如下:
- 手动触发
1、save:redis 127.0.0.1:6379> SAVE
阻塞当前的redis服务器,直到RBD完成位置,对于内存较大的实例影响时间较长
2、bgsave:redis 127.0.0.1:6379> BGSAVE
redis进程执行fork创建子进程,RDB持久化有子进程负责,完成后自动结束,阻塞只发生在fork阶段,时间极短
- 自动触发
1、使用save的相关配置,如:“save m n ”,表示M秒内数据集存在N次修正,会自动触发
2、执行debug reload命令重新加载redis时,会触发
3、默认情况下执行shotdown时,如果没有开启AOF,会触发
AOF
AOF以独立日志的方式记录每一次的些命令,重启时执行AOF文件,主要解决数据持久化的实时性。流程如下:
重写机制
随着命令不断写入AOF,文件会越来越大,redis引入AOF重写机制压缩文件。AOF文件重写是把redis进程内的数据转化为写命令同步到新的AOF文件的过程。
文件变小的原因
-
进程内超时的数据不再写入文件
-
旧的AOF文件内无效的命令,新生成的文件只保留最终写入数据的命令
-
多条命令合并为一个命令
数据重新加载
AOF和RDB都可以用于服务器重启时的数据恢复。其持久化文件加载流程如下:
文件的校验
-
当加载损坏的AOF文件时,会拒绝启动。
-
当加载错误格式的AOF文件时,会先备份,然后进行自动修复。
-
当机器突然掉电导致文件不完整,redis会兼容这种情况(aof-load-truncated)