redis自顶向下源码阅读(十一)——读取 RDB 文件1
redis自顶向下源码阅读(十一)——读取 RDB 文件1
1. 声明变量
int rdbLoad(char *filename) {
uint32_t dbid;
int type, rdbver;
redisDb *db = server.db+0;
char buf[1024];
long long expiretime, now = mstime();
FILE *fp;
// 专门用于 io 的数据结构
rio rdb;
// 判断文件是否正常打开
if ((fp = fopen(filename,"r")) == NULL) return REDIS_ERR;
2. 对rio数据结构初始化
int rdbLoad(char *filename) {
rioInitWithFile(&rdb,fp);
// 该函数用于计算 rdb 的校验和
rdb.update_cksum = rdbLoadProgressCallback;
// 单次最大读写的块大小
rdb.max_processing_chunk = server.loading_process_events_interval_bytes;
}
void rioInitWithFile(rio *r, FILE *fp) {
*r = rioFileIO;
r->io.file.fp = fp;
r->io.file.buffered = 0;
r->io.file.autosync = 0;
}
// 用于 rio 的初始化,里面包含 rdb 文件 io 的函数
static const rio rioFileIO = {
rioFileRead,
rioFileWrite,
// 得到文件位置指针当前位置相对于文件首的偏移字节数
rioFileTell,
// 用于刷新 fp 的缓冲区
rioFileFlush,
NULL, /* update_checksum */
0, /* current checksum */
0, /* bytes read or written */
0, /* read/write chunk size */
{ { NULL, 0 } } /* union for io-specific vars */
};
3. 解析REDIS版本号
// 读取文件的前 9 个字节
if (rioRead(&rdb,buf,9) == 0) goto eoferr;
buf[9] = '