[redis读书笔记] 第二部分 单机数据库 RDB持久化
Posted jiangz222
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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持久化的主要内容,如果未能解决你的问题,请参考以下文章
《Redis设计与实现》[第二部分]单机数据库的实现-C源码阅读
《Redis设计与实现》[第二部分]单机数据库的实现-C源码阅读
《Redis设计与实现》[第二部分]单机数据库的实现-C源码阅读