10.1 RDB文件的创建和载入
有俩个Redis命令可以用于生成RDB文件,一个是SAVE,另一个是BGSAVE。
SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止。
BGSAVE命令会派生出一个子金城关负责创建RDB文件,服务器进程继续处理命令请求。
RDB文件的载入工作是在服务器启动时自动执行的,因为AOF文件的更新频率通常比RDB文件的更新频率高,所以:
① 如果服务器开启了AOF持久化功能,那么服务器会优先使用过AOF文件来还原数据库状态;
② 只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据库状态。
服务器判断该用哪个文件来还原数据库状态的流程如下图所示:
10.1.2 BGSAVE命令执行时的服务器状态
int rdbSave(char *filename) {//save命令执行函数 char tmpfile[256]; FILE *fp; rio rdb; int error; snprintf(tmpfile,256,"temp-%d.rdb", (int) getpid()); fp = fopen(tmpfile,"w"); if (!fp) { redisLog(REDIS_WARNING, "Failed opening .rdb for saving: %s", strerror(errno)); return REDIS_ERR; } rioInitWithFile(&rdb,fp); if (rdbSaveRio(&rdb,&error) == REDIS_ERR) { errno = error; goto werr; } /* Make sure data will not remain on the OS's output buffers */ if (fflush(fp) == EOF) goto werr; if (fsync(fileno(fp)) == -1) goto werr; if (fclose(fp) == EOF) goto werr; /* Use RENAME to make sure the DB file is changed atomically only * if the generate DB file is ok. */ if (rename(tmpfile,filename) == -1) { redisLog(REDIS_WARNING,"Error moving temp DB file on the final destination: %s", strerror(errno)); unlink(tmpfile); return REDIS_ERR; } redisLog(REDIS_NOTICE,"DB saved on disk"); server.dirty = 0; server.lastsave = time(NULL); server.lastbgsave_status = REDIS_OK; return REDIS_OK; werr: redisLog(REDIS_WARNING,"Write error saving DB on disk: %s", strerror(errno)); fclose(fp); unlink(tmpfile); return REDIS_ERR; }
在BGSAVE命令执行期间,SAVE、BGSAVE命令会被服务器拒绝,
BGSAVE和BGREWRITEAOF不能同时执行:
① 如果BGSAVE正在执行,那么BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕之后执行。
② 如果BGREWRITEAOF命令正在执行,那么客户端发送的BGSAVE命令会被服务器拒绝。
10.2 自动间隔性保存
如果向服务器提供以下配置:
save 900 1
save 300 10
save 60 10000
那么只要满足任意一个,BGSAVE命令就会被执行:
服务器在900秒之内,对数据库进行了至少1次修改。
服务器在300秒之内,对数据库进行了至少10次修改。
服务器在60秒之内,对数据库进行了至少10000次修改。
serverCron默认每隔100毫秒就会执行一次,其中一项工作就是检查save选项所设置的
保存条件是否已经满足。
服务器状态中的保存条件
RDB文件结构:
RDB文件数据库结构:
key_value_pairs结构:
10.5 重点回顾
Ⅰ RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据。
Ⅱ SAVE命令由服务器进程直接执行保存操作,所有该命令会阻塞服务器。
Ⅲ BGSAVE命令由紫禁城执行保存操作,所以该命令不会阻塞服务器。
Ⅳ 服务器状态中会保存所有用save选项设置的保存条件,当任意一个保存条件被满足时,服务器会自动执BGSAVE命令。
Ⅴ RDB文件是一个经过压缩的二进制文件,由多个部分组成。
Ⅵ 对于不同类型的键值对,RDB文件会使用不同的方式来保存他们。