RDB持久化概述
Redis是内存数据库,将数据存储到内存中。不想办法持久化到磁盘,则机器断电数据将无法找回。RDB持久化提供了一种Redis数据库持久化方案。
RDB持久化功能将数据库中保存的键值对生成为一个二进制的RDB文件,也可通过RDB文件还原到数据库状态。RDB文件保存在磁盘中,解决了Redis数据丢失的问题。
RDB文件的创建
RDB文件的创建可以通过SAVE或BGSAVE命令。SAVE命令阻塞当前进程,生成RDB文件;BGSAVE命令则是开启子进程创建RDB文件,父进程继续处理其他命令。
RDB文件的创建代码在rdb.c / int rdbSave(char *filename) SAVE和BGSAVE 都会调用rdbSave函数生成RDB文件,
只是BGSAVE先fork出子进程,通过子进程调用。如下图,只截取了部分
命令执行期间注意事项:
1.在BGSAVE执行期间,此时发送SAVE命令会被拒绝执行
2.在BGSAVE执行期间,此时发送BGSAVE命令会被拒绝执行
3.在BGREWIRTEAOF执行期间,发送BGSAVE命令会拒绝执行
4.在BGSAVE执行期间,发送BGREWRITEAOF命令会拒绝执行
以上四点可参考代码段,其中rdb_child_pid为-1时,表示此时并未进行BGSAVE命令,在函数rdbSaveBackground调用中,rdb_child_pid被设置为子进程PID。当子进程完成BGSAVE写入后,在函数backgroundSaveDoneHandlerDisk中rdb_child_pid被重新设置为-1。
RDB持久化的自动执行:
在配置文件中可以写入RDB文件创建的规则,如下图所示 save<time><count> 表示time时间内修改了至少count次数据库。则达成条件。
RDB的配置会被保存在redisServer中成员中,这个结构由时间和修改次数组成。
此时配置已经保存下来了,还需知道1).当前服务器距离上一次创建RDB文件到现在又修改了多少次,2).以及上一次创建RDB文件到现在又经过了多长时间。
Redis服务器中使用下图dirty记录上次成功保存后,又修改的次数。lastsave为上次成功保存的UNIX时间戳
此时就能够判断出配置的save命令能否达成保存条件了,这个判断过程通过serverCron这个服务器的周期性函数进行操作,默认每隔100毫秒执行一次,serverCron这个函数其中的一项工作就是检查save是否满足配置条件。
如下图为截取serverCron函数中的一段,遍历配置,是否有符合条件的配置,存在符合配置,则执行BGSAVE。执行BGSAVE成功后,会更新dirty为0,time为最近一次成功保存的时间戳。
RDB文件的结构
保存的RDB文件结构,我觉得还是一张图比较容易理解和记忆
(这个工具用起来比画图舒服多了.)
RDB文件暂时先这样吧,再有什么收获再补充。