redis 内存数据持久化操作命令

redis的内存数据持久化操作命令包括save,bgsave,lastsave和shutdown命令.这几个命令均不带任何参数.

redis save命令
redis save命令的格式为save, 该命令将把内存数据保存到磁盘文件.telnet的模拟操作为:

telnet 10.7.7.132 6379
Trying 10.7.7.132...
Connected to 10.7.7.132.
Escape character is '^]'.
set mykey 7
myvalue
+OK
save
+OK

redis save命令对应的处理函数为saveCommand, 其实现为(redis.c):

1506 static void saveCommand(redisClient *c) {
1507     if (saveDb("dump.rdb") == REDIS_OK) {
1508         addReply(c,shared.ok);
1509     } else {
1510         addReply(c,shared.err);
1511     }
1512 }

save命令调用函数saveDb把内存数据库中的数据保存到磁盘文件dump.rdb中,保存成功向客户端发送操作成功提示字符串,否则,发送操作失败提示字符串.函数saveDb在定时事件的处理函数中已经分析过,在此从略.需要注意的是save命令是个同步命令,在内存数据写入磁盘未结束之前,是不会有新客户端连接处理,以及任何其他redis命令处理的.

redis bgsave命令
redis bgsave命令的格式是bgsave, 该命令将内存数据保存到磁盘文件.telnet的模拟操作为:

telnet 10.7.7.132 6379
Trying 10.7.7.132...
Connected to 10.7.7.132.
Escape character is '^]'.
set mykey 7
myvalue
+OK
bgsave
+OK

redis bgsave命令对应的处理函数为bgsaveCommand, 其实现为(redis.c):

1514 static void bgsaveCommand(redisClient *c) {
1515     if (server.bgsaveinprogress) {
1516         addReplySds(c,sdsnew("-ERR background save already in progress\r\n"));
1517         return;
1518     }
1519     if (saveDbBackground("dump.rdb") == REDIS_OK) {
1520         addReply(c,shared.ok);
1521     } else {
1522         addReply(c,shared.err);
1523     }
1524 }

Line1515:1518如果正在进行数据写磁盘操作,则向客户端发送错误提示字符串.Line1519调用函数saveDbBackground写内存数据到磁盘文件,在定时事件的处理函数中已经分析过该函数,saveDbBackground是个异步的操作,会fork一个子进程来进行写磁盘操作,子进程在处理完写入操作后结束.父进程在设置玩全局标识server.bgsaveinprogress后立即返回.

redis lastsave命令
redis lastsave命令的格式为lastsave,该命令返回最近一次写磁盘操作的时间戳.该命令通常配合bgsave命令,来判断bgsave命令是否操作完成.telnet的模拟操作为:

telnet 10.7.7.132 6379
Trying 10.7.7.132...
Connected to 10.7.7.132.
Escape character is '^]'.
set mykey 7
myvalue
+OK
bgsave
+OK
lastsave
1533971303

redis lastsave命令对应的处理函数为lastsaveCommand,其实现为(redis.c):

1480 static void lastsaveCommand(redisClient *c) {
1481     addReplySds(c,
1482         sdscatprintf(sdsempty(),"%lu\r\n",server.lastsave));
1483 }

redis shutdown命令
redis shutdown命令的格式为shutdown, 该命令将数据库内存数据保存到磁盘,然后结束redis服务.telnet的模拟操作为:

telnet 10.7.7.132 6379
Trying 10.7.7.132...
Connected to 10.7.7.132.
Escape character is '^]'.
set mykey 7
myvalue
+OK
shutdown
Connection closed by foreign host.

redis shutdown命令对应的处理函数为shutdownCommand,其实现为(redis.c):

1526 static void shutdownCommand(redisClient *c) {
1527     redisLog(REDIS_WARNING,"User requested shutdown, saving DB...");
1528     if (saveDb("dump.rdb") == REDIS_OK) {
1529         redisLog(REDIS_WARNING,"Server exit now, bye bye...");
1530         exit(1);
1531     } else {
1532         redisLog(REDIS_WARNING,"Error trying to save the DB, can't exit");
1533         addReplySds(c,sdsnew("-ERR can't quit, problems saving the DB\r\n"));
1534     }
1535 }

调用saveDb保存内存数据到磁盘文件,如果成功,调用库函数exit结束redis服务,否则,向客户端发送错误提示字符串.因为saveDb是同步写入操作,所以redis将拒绝新客户端连接和任何其他redis命令.

猜你喜欢

转载自blog.csdn.net/azurelaker/article/details/81586736
今日推荐