SHUTDOWN [NOSAVE|SAVE]

SHUTDOWN 命令执行如下操作:

  • 停止所有客户端
  • 如果配置了save 策略 则执行一个阻塞的save命令
  • 如果开启了AOF,则刷新aof文件
  • 关闭redis服务进程(redis-server)

如果配置了持久化策略,那么这个命令将能够保证在关闭redis服务进程的时候数据不会丢失。

如果仅仅在客户端执行 QUIT 命令,然后 执行 QUIT 命令,那么数据的完整性将不会被保证,因为其他客户端可能在执行这两个命令的期间修改数据库的数据。

注意: 一个没有配置持久化策略的redis实例 (没有aof配置, 没有 “save” 命令) 将不会在执行SHUTDOWN命令的时候转存一个rdb文件,可以提高关闭的速度,例如仅用来做缓存的 redis 不需要配置持久化转存。

*SAVE 和 NOSAVE 修饰符

通过指定一个可选的修饰符可以改变这个命令的表现形式,比如:

  • SHUTDOWN SAVE 能够在即使没有配置持久化的情况下强制数据库存储。
  • SHUTDOWN NOSAVE 能够在配置一个或者多个持久化策略的情况下阻止数据库存储. (你可以假想它为一个中断服务的 ABORT 命令)。

*SHUTDOWN 关闭失败的情况

当配置了 AOF 时,shutdown 可能会失败由于系统处于不允许立刻执行磁盘持久化操纵。

当有一个AOF的子进程在执行AOF重写时,Redis 会简单的kill 该子进程。有两种列外的情况,SHUTDOWN 会返回失败:

  • AOF 刚刚打开,首次进行 AOF rewrite 创建初始的 AOF 文件。这种情况下停止redis将会丢失所有数据:一旦停止 redis时,虽然开启了AOF,但是还没有创建任何AOF文件。
  • 复制节点打开了 AOF,向 master 发起重连,执行数据全同步,然后重起AOF,创建初始AOF文件。可能会丢失复制自master节点的数据。

如果我们只是想立刻关闭redis,而不管其它情况。正确的做法是先发送CONFIG appendonly no ,然后执行SHUTDOWN NOSAVE.。前一个命令关闭 AOF(如果打开AOF),终止可能存在的 AOF 重写子进程,这样后一个命令关闭不会失败。

*返回值

字符串 当发生错误的时候返回状态码 . 当成功的时候不返回任何值,因为服务退出,链接关闭。