reids是键值对数据库服务器,数据库和数据库中键值对统称为数据库状态,是内存数据库,redis服务器进程停止将会使得服务器中的数据库状态消失,RDB持久化操作将内存中的数据库状态保存到磁盘里,避免数据意外丢失,手动执行RDB持久化或者根据服务器配置定期执行,可以以将某个时间点上的数据库状态以二进制文件形式保存到磁盘上,通过该文件可以还原数据库状态
save bgsave命令生成RDB文件,save命令阻塞服务器进程直到RDB文件创建完成,阻塞期间不能处理任何命令请求
bgsave命令没有直接阻塞服务器进程,生成了子进程在后台创建RDB文件,save命令和bgsave命令都执行了函数rdbsave,不同的是在rdbsave中save直接执行了创建RDB文件,而bgsave是生成了子进程创建RDB文件,在完成之后会通知父进程,父进程继续执行命令
RDB文件的载入实在服务器启动的时候自动执行的,redis没有专门载入RDB文件的命令,只要检测到文件存在就会自动载入RDB文件,服务器在载入RDB文件期间会一致处于阻塞状态知道工作完成为止,AOF文件的更新频率通常比RDB文件高,所以,如果服务器开启了AOF持久化功能,那么服务器将会优先使用AOF文件来还原数据库状态载入AOF文件,只有在AOF持久化功能处于关闭状态的时侯,服务器才会使用RDB文件来还原数据库状态,载入RDB文件。save命令执行的时候,redis服务器将会阻塞,此时客户端发送的所有的命令请求都会被阻塞只有在服务器执行完save命令之后,重新开始接收命令请求的时候,客户端发送的命令才会被执行,bgsave命令的保存工作室由子进程执行的,在子进程的创建RDB的过程中,Redis服务器仍然可以继续处理客户端的命令请求,但是在BGSAVE执行的时候,SAVE,BGSAVE,BGREWAITAOF三个命令会和平时有所不同,执行期间客户端发送的SAVE命令会被服务器拒绝,服务器禁止SAVE命令和BGSAVE命令同时执行,是为了避免父进程和子进程同时执行两个rdbSave调用,防止产生竞争条件,在BGSAVE命令执行期间客户端发送的BGSAVE命令也会被服务器拒绝,因为两个BGSAVE命令也会产生竞争条件,在BGSAVE命令执行期间BGREWAITAOF命令也不能同时执行,因为在BGSAVE命令执行期间客户端发送的BGREWAITAOF命令会被延迟到BGSAVE命令执行完毕之后进行,如果BGREWAITAOF命令正在执行,则客户端发送的BGSAVE命令会被服务器拒绝。因为BGREWAITAOF和BGSAVE这两个命令都是由子进程执行的,所以在操作方面不会有什么冲突,但是从性能方面考虑,并发的两个子进程同时执行大量的写操作,不太好。
因为BGSAVE命令由服务器创建的子进程执行保存工作,不会阻塞服务器进程,因此一般情况下,用户可以配置服务器的save选项,让服务器每隔一段 时间自动执行一次BGSAVE命令,可以通过save选项设置多个保存条件,只要其中一个满足就会执行BGSAVE命令,比如我们配置 save 900 1, save 300 10 ,save 60 10000,那么满足这三个条件中的一个就会执行,服务器在900秒中执行了至少一次修改,服务器在300命中执行了至少10的更改,服务器在60 秒执行了最少10000次的执行
设置保存条件,redis服务器启动的时候,用户可以通过指定配置文件或者传入启动参数的方式设置save选项,如果没有主动设置save选项,save选项将会设置默认的保存条件,保存条件放在redis服务器的服务器状态redisServer/redis.h结构中,redisServer结构中有一个redisDb数据库类型的数组db保存了服务器中的所有的数据库,服务器状态结构redisServer中的saveparam数组中的每个元素都是save选项的保存条件。除此之外redisServer结构中保存了dirty和lastdate两个属性,dirty属性表示服务器对服务器中所有的数据库进行了多少次修改包括写入删除更更新,而lastdate记录了服务器上一次成功执行save命令或者BGSAVE命令的时间,像数据库中添加一个元素此时dirty为1,向数据中添加了三个元素,dirty值为3。
服务器周期性函数serverCron默认每个100毫秒会执行一次,该函数用于对正在运行的服务器进行维护,serverCron函数其中一个功能是检查save选项所设置的条件是否已经满足,如果满足的话就BGSAVE命令
RDB持久化
最新推荐文章于 2024-06-25 00:15:00 发布