首页 > 代码库 > [redis读书笔记] 第二部分 单机数据库 RDB持久化
[redis读书笔记] 第二部分 单机数据库 RDB持久化
内存中的rdb是会存为文件以做到RDB持久化的。RDB文件时一个二进制文件。
一 载入与存储
文件的载入是在server启动时进行的(rdbload()),因为AOF的更新频率比RDB高,所以如果AOF持久化功能开启,服务器会优先从AOF还原DB,只有AOF关闭,才从RDB还原数据库。
文件的存储由rdbSave()/rdb.c来实现,SAVE/BGSAVE 命令可以触发,前者直接由Redis server处理,此时不能处理其他命令,后者会启动子进程进行处理,此时server可以处理其他命令,但是,当BGSAVE执行时,SAVE命令就不能再执行了,再次执行BGSAVE也是不行的,最后BGREWRITEAOF也是不能同时和BGSAVE执行的。
二 周期存储
save 900 1
save 300 10
save 60 10000
上面三条命令代表满足条件之一就会触发BGSAVE:
1. 900秒内至少有1次更新
2. 300秒内至少10次更新
3. 60秒内至少有10000次更新
这些时间和更新次数的设置,存储在
struct saveparam { // 多少秒之内 time_t seconds; // 发生多少次修改 int changes; }; struct redisserver{ ... struct saveparam *saveparams; /* Save points array for RDB */
...
// 自从上次 SAVE 执行以来,数据库被修改的次数
long long dirty; /* Changes to DB from the last save */
// 最后一次完成 SAVE 的时间
time_t lastsave; /* Unix time of last successful save */
... };
上面的dirty,代表上次成功的SAVE/BGSAVE后,对数据库做了多少次的更新。lastsave记录上次成功执行SAVE/BGSAVE的时间。
serverCron()函数会做100ms的周期执行,用saveparams中的值和 dirty以及lastsave比较,来做是否更新RDB的处理。
三 RDB的文件结构
RDB文件是二进制文件,格式自定义,没有太多可说,举例如下:
[redis读书笔记] 第二部分 单机数据库 RDB持久化
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。