【赵渝强老师】Redis的RDB数据持久化-二、剖析RDB持久化机制

时间:2024-11-12 08:17:15

在rdb.c文件中可以找到创建RDB文件的函数rdbSave(),函数定义如下:

/* Save the DB on disk. Return C_ERR on error, C_OK on success. */
int rdbSave(char *filename, rdbSaveInfo *rsi) {
    ......
    // 创建临时文件
    snprintf(tmpfile,256,"temp-%d.rdb", (int) getpid());
    fp = fopen(tmpfile,"w");
    ......
    // 初始化I/O
    rioInitWithFile(&rdb,fp);
    // 开始执行RDB
    startSaving(RDBFLAGS_NONE);
    ......
    //如果持久化成功操作成功,则用临时文件替代旧的文件
    if (rename(tmpfile,filename) == -1) {
        char *cwdp = getcwd(cwd,MAXPATHLEN);
        serverLog(LL_WARNING,
        "Error moving temp DB file %s on the final "
        "destination %s (in server root dir %s): %s",
        tmpfile,
        filename,
        cwdp ? cwdp : "unknown",
        strerror(errno));
        unlink(tmpfile);
        stopSaving(0);
        return C_ERR;
    }
    serverLog(LL_NOTICE,"DB saved on disk");
    //持久化成功后,将计数器重置为0,并更新最近存储时间。
    server.dirty = 0;
    server.lastsave = time(NULL);
    server.lastbgsave_status = C_OK;
    stopSaving(1);
    return C_OK;
    ......
}