配置过程
默认快照方式是开启的,Redis会根据快照保存策略把快照写入到dump.rdb(默认名称)文件中,该文件保存位置可以在配置文件中设置,就是dir配置项。
默认保存策略如下:
命令行有一个save或者gbsave命令,作用是把数据同步到dump.rdb中,不过这两个命令的是有区别的,在原理部分会谈到。
原理
RDB持久化可手动运行也可以自动定期执行,然后把某个时间点的数据库状态保存到RDB文件中,默认是dump.rdb,该文件是一个经过压缩的二进制文件,上面已经说了如何去配置策略和使用命令。下面来说一下save和gbsave的区别。
SAVE命令运行后会阻塞Redis服务器进程,直到RDB文件创建完毕,在阻塞过程过程中服务器不处理任何来自外界的请求无论读还是写(阻塞所有请求)。
BGSAVE命令与SAVE不同,该命令会产生一个子进程,由此子进程来处理创建RDB文件任务,而服务器的父进程继续响应外部请求。
BGSAVE在执行过程中不会阻塞请求,但是并不是说任何请求都可以被执行,在服务器执行BGSAVE期间,对于执行SAVE、BGSAVE和BGREWRITEAOF这三个命令会有所有不同。
在BGSAVE执行期间: | |
执行SAVE命令 | 会被服务器拒绝,服务器禁止SAVE命令和BGSAVE同时执行,因为不可能让两个命令去调用同一函数然后去操作同一个RDB文件 |
执行BGSAVE命令 | 会被服务器拒绝,因为已经有一个在进行了,没必要再允许一个 |
执行BGREWRITEAOF命令 | 会被延迟执行,BGSAVE子进程完成后,才会执行BGREWRITEAOF命令 |
在BGREWRITEAOF执行期间: | |
执行BGSAVE命令 | 会被拒绝,这两个命令没有冲突的地方,只是同时执行会产生大量磁盘写操作,会影响性能,所以这是一个规则上的拒绝,不是一个技术上的拒绝 |
上面提到了保存策略,那么这个保存策略是如何被执行的呢?
简单来说就是三个内容,条件、计数器与上次保存时间、检查器。检查器周期性(默认100毫秒)检测计数器与上次保存时间是否满足条件组合之一(save900 1、save 300 10、save 6010000),是则执行BGSAVE。
计数器dirty:用于记录修改次数;上次保存时间lastsave:用于保存上次保存的时间。
注意:Redis模式会运行16个数据库(编号为0---15),在执行保存的过程中无论是SAVE触发还是BGSAVE触发,都是会把所有非空数据库进行保存的。
时间: 2024-10-30 23:01:02