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命令.