这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战
Redis serverCron函数🥈
执行被延迟到BGREWRITEAOF
服务器执行BGSAVE命令期间,如果客户端向服务器发来BGREWRITEAOF命令,服务器会将BGREWRITEAOF命令的执行时间延迟到BGSAVE命令执行时间延迟到BGSAVE命令之后
aof_rewrite_scheduledb表示是否延迟BGREWRITEAOF
serverCron函数执行的时候,函数检查BGSAVE或则BGREWRITEAOF命令是否正在执行,如果这两个命令都没执行,aof_rewrite_scheduledb属性为1,服务器就会执行被延迟的BGREWRITEAOF命令
检查持久化操作的运行状态
rdb_child_pid记录执行BGSAVE命令的子进程的ID
aof_child_pid记录执行BGSAVE命令的子进程的ID
serverCron函数会检查这两个属性的值,只有不是-1,就会执行wait3函数,检查子进程是否有信号📶发来,如果有信号,表示新的RDB文件或者AOF文件已经生成完毕,服务器需要对文件进行替换,如果信号没有到达,表示持久化还没完成,不做什么操作
如果这两个属性都为-1,说明服务器没有进行持久化操作,需要查看BGREWRITEAOF是否被延迟,如果有的话,开始BGREWRITEAOF操作,然后检查服务器是否满足自动保存条件,如果满足就执行BGSAVE,然后检查服务器设置的AOF重写条件是否满足,如果满足,服务器没有在执行其他持久化操作 就进行BGREWRITEAOF操作
将AOF缓冲区中的内容写入AOF文件
serverCron会调用程序将AOF缓冲区内容写入到AOF文件中
关闭异步客户端
关闭输出缓冲区大小超过限制的客户端
增加cronloops计数器的值
cronloops属性记录了serverCron函数执行的次数,它的功能是在复制模块中实现每执行serverCron函数N次就执行指定代码的功能