一、描述
rdb(redis databses)
redis的其中一个持久化数据方式(默认),是rdb模式,简单说就是会再一定的触发条件下,会启动子进程生成dump.rdb(快照文件)
二、源码解析
2.1 src/rdb.c:rdbSaveBackground
代码逻辑:
1.fork(),创建出子进程
2.子进程调用rdbSave函数,完成实际的dump操作
2.2 src/rdb.c:
代码逻辑:
1.创建临时文件,tmp-{pid}.rdb
snprintf(tmpfile,256,"temp-%d.rdb", (int) getpid());
2.将快照数据,写入到临时文件中
rioInitWithFile(&rdb,fp);
if (rdbSaveRio(&rdb,&error) == C_ERR) {
errno = error;
goto werr;
}
3.将数据实际写入到磁盘中
if (fflush(fp) == EOF) goto werr; //将用户空间的缓存数据刷入内核空间的缓存数据中
if (fsync(fileno(fp)) == -1) goto werr;//将内核空间的缓存数据刷入到实际的物理磁盘中
if (fclose(fp) == EOF) goto werr; //关闭文件,完成写入操作
4.将临时文件改名为dump.rdb
rename(tmpfile,filename)
三、触发条件设置
save 900 1
save 300 10
save 60 10000
意思是:
900秒内有1次数据改变
300秒内有10次数据改变
60秒内有10000次数据改变
满足上面其中一个条件,便会触发生成dump.rdb快照文件的操作