Redis(四):持久化之---RDB持久化的配置和原理

配置过程


默认快照方式是开启的,Redis会根据快照保存策略把快照写入到dump.rdb(默认名称)文件中,该文件保存位置可以在配置文件中设置,就是dir配置项。

默认保存策略如下:

wKiom1eB6bWDp-HeAADtJPCnTYQ779.jpg-wh_50

命令行有一个save或者gbsave命令,作用是把数据同步到dump.rdb中,不过这两个命令的是有区别的,在原理部分会谈到。

wKioL1eB6deTRvgtAAATiU9X5r8213.jpg-wh_50

原理


RDB持久化可手动运行也可以自动定期执行,然后把某个时间点的数据库状态保存到RDB文件中,默认是dump.rdb,该文件是一个经过压缩的二进制文件,上面已经说了如何去配置策略和使用命令。下面来说一下savegbsave的区别。

SAVE命令运行后会阻塞Redis服务器进程,直到RDB文件创建完毕,在阻塞过程过程中服务器不处理任何来自外界的请求无论读还是写(阻塞所有请求)。

BGSAVE命令与SAVE不同,该命令会产生一个子进程,由此子进程来处理创建RDB文件任务,而服务器的父进程继续响应外部请求。

BGSAVE在执行过程中不会阻塞请求,但是并不是说任何请求都可以被执行,在服务器执行BGSAVE期间,对于执行SAVEBGSAVEBGREWRITEAOF这三个命令会有所有不同。

BGSAVE执行期间:
执行SAVE命令 会被服务器拒绝,服务器禁止SAVE命令和BGSAVE同时执行,因为不可能让两个命令去调用同一函数然后去操作同一个RDB文件
执行BGSAVE命令 会被服务器拒绝,因为已经有一个在进行了,没必要再允许一个
执行BGREWRITEAOF命令 会被延迟执行,BGSAVE子进程完成后,才会执行BGREWRITEAOF命令
BGREWRITEAOF执行期间:
执行BGSAVE命令 会被拒绝,这两个命令没有冲突的地方,只是同时执行会产生大量磁盘写操作,会影响性能,所以这是一个规则上的拒绝,不是一个技术上的拒绝

上面提到了保存策略,那么这个保存策略是如何被执行的呢?

简单来说就是三个内容,条件、计数器与上次保存时间、检查器。检查器周期性(默认100毫秒)检测计数器与上次保存时间是否满足条件组合之一(save900  1save 300   10save 6010000),是则执行BGSAVE

计数器dirty:用于记录修改次数;上次保存时间lastsave:用于保存上次保存的时间。

注意:Redis模式会运行16个数据库(编号为0---15),在执行保存的过程中无论是SAVE触发还是BGSAVE触发,都是会把所有非空数据库进行保存的。




      本文转自linuxjavachen  51CTO博客,原文链接:http://blog.51cto.com/littledevil/1813953,如需转载请自行联系原作者