一 概述
RDB(Redis DataBase),RDB持久化方案保存某个时间点的全量数据快照写入磁盘,也是老版本中的默认持久化方式,它将内存中的数据以快照的方式写入二进制文件(默认文件名为dump.rdb)。
二 Redis中RDB的相关配置
快照保存策略:
- save 900 1 //该配置为Redis在900秒内存在如果一次写入操作(set操作)就会保存一次快照
- save 300 10 //该配置为Redis在300秒内存在如果写入操作(set操作)达到十次就会保存一次快照,否则执行1
- save 60 10000//该配置为Redis在60秒内存在如果一次写入操作(set操作)达到10000次就会保存一次快照,否则执行2或者执行1
- save " " //禁止Redis服务器使用RDB持久化方案
RDB文件压缩配置:
rdbcompression yes
该配置为yes的时候是指在备份的时候要先将RDB文件进行压缩,实际情况我们是可以设置为no的,因为Redis本身就是属于CPU密集型服务器,使用压缩功能会比较耗性能。
stop-writes-on-bgsave-error yes
此配置表示当备份进程出错的时候,主进程就会停止接收新的写入操作,从而保证数据持久化的一致性,如果我们的业务拥有完善的检测方案,我们可以将其设置为false,所以这些视情况而定。
dbfilename dump.rdb //保存的文件名
三 RDB持久化方式的实现方方法
一 save方式
save方式是在主线程中保存快照,同时Redis刚好是由一个主线程处理所有的请求,在这种情况下会阻塞所有的client请求,所以一般情况下不会使用save操作。
如图:save命令阻塞一定时间。
二 BGSAVE方式
BGSAVE方式先fork出一个子进程来创建RDB文件,记录并接收当前数据库的状态,且不阻塞服务器的主进程,这样子进程负责完成子进程的创建,父进程继续处理其他接收到的命令,当子进程创建好文件之后会发送消息给父进程,当父进程在处理接收到的其他命令时通过轮询来获取接收子进程发送过来的信号。
如图:BGSAVE命令之后,BGSAVE是通过后台的运行方式保存RDB文件。
使用BGSAVE命令之后会立即返回一个OK的返回码,此时,Redis会产生一个子进程处理,并恢复主进程对客户端的服务。实际应用中,我们可以利用java的定时器来实现定期待用Redis的BGSAVE指令,从而实现实时备份RDB文件。
mv dump.rdb dumpTimeStamp.rdb //按照时间戳保存不同时间的RDB文件,作为Redis某一时间的全量脚本。
BGSAVE的原理:
三 自动化触发RDB持久化方式
根据Redis.conf配置文件中的SAVE m v 定时触发RDB文件的保存(实际上用的是BGSAVE方式),在从节点进行RDB文件全量复制的时候,主节点发送RDB文件给从节点完成RDB全量复制时,主节点会触犯BGSVAE。同时在执行Debgu Reload和执行shutDown命令(没有开启AOF持久化时),会自动触发RDB持久化。