众所周知,Redis中的数据是存储到内存中的,如果因为什么原因Redis服务down了,那么里面的数据就丢失了。那么持久化对Redis就至关重要了,那么本文先来讲述下Redis中的RDB持久化机制。
RDB持久化是把当前进程数据生成快照保存到硬盘的过程。触发RDB持久化过程分为手动触发和自动触发。
手动触发
手动执行save,或者bgsave,会触发RDB的持久化。
- save:会阻塞Redis服务器。
- bgsave:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。
- 总结:显然,bgsave是对save阻塞问题的优化,因此Redis内部所有的设计RDB的操作都采用bgsave。
自动触发
当有以下四种情况时,会自动触发RDB的持久化。
- 使用save相关配合,如save m n,表示m秒内存在n次修改时,自动触发bgsave。
- 如果从节点执行全量复制操作,主节点自动执行basave生成RDB文件并发送给从节点。
- 执行debug reload命令重新加载Redis时,也会自动触发bgsave操作。
- 默认情况执行shutdown命令时,如果没有开启AOF持久化功能,则自动执行bgsave。
bgsave流程
如上图:
- 执行bgsave命令时,Redis主进程会判断当前是否存在执行的子进程,如RDB或者AOF子进程,如存在,则bgsave命令则直接返回。
- 子进程生成临时快照文件,然后原子性的进行替换旧的快照文件。
- 子进程完成后,会发送信号给父进程,父进程更新相关信息。
重要分析命令
以下命令返回的latest_fork_usec选型,是最近一个fork操作的耗时,单位为微妙,可以分析Redis主进程被阻塞的时间。
info stats
以下命令,可以查看最后一次生成RDB的时间:对应info命令中的rdb_last_save_time选项。
lastsave
关于持久化的信息,也可使用如下命令来查看:
info persistence
RDB经过压缩后,远小于内存,压缩选项,默认开启(yes):
config get rdbcompression
如果RDB文件损坏,可以使用redis-check-dump工具监测,并获取到报告。
RDB的相关配置
dir:RDB和AOF等文件的目录。
dbfilename:RDB的文件名字。
RDB持久化的优缺点
优点:紧凑压缩的二进制文件,恢复的速度快与AOF。
缺点:是对文件的快照,比较重量,不会频繁操作,不适合实时的持久化,可能会丢失部分数据。