MIGRATE host port key|"" destination-db timeout [COPY] [REPLACE] [AUTH password] [AUTH2 username password] [KEYS key [key ...]]

将 key 原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功, key 会出现在目标实例上,而当前实例上的 key 会被删除。

MIGRATE 命令是一个原子操作,它在执行的时候会阻塞进行迁移的两个实例,直到以下任意结果发生:迁移成功,迁移失败,等待超时。

Redis 3.2 以上版本支持一个命令迁移多个 key,通过使用空的双引号 ”” 替换 key,并在命令结尾增加 KEYS 命令,匹配要迁移的多个key

命令的内部实现是这样的:它在当前实例对给定 key 执行 DUMP 命令 ,将它序列化,然后传送到目标实例,目标实例再使用 RESTORE 对数据进行反序列化,并将反序列化所得的数据添加到数据库中;当前实例就像目标实例的客户端那样,只要看到 RESTORE 命令返回 OK ,它就会调用 DEL 删除自己数据库上的 key 。

timeout 参数以毫秒为格式,指定当前实例和目标实例进行传输的最大间隔时间。这说明操作并不一定要在 timeout 毫秒内完成,只是说数据传送的时间不能超过这个 timeout 。

MIGRATE 命令需要在给定的时间规定内完成 IO 操作。如果在传送数据时发生 IO 错误,或者达到了超时时间,那么命令会停止执行,并返回一个特殊的错误: IOERR 。当 IOERR 出现时,有以下两种可能的结果

  • 可能存在于两个实例。
  • 可能只存在于源实例。

超时不会导致 key 丢失。但是如果一个客户端执行 MIGRATE 命令,并且不幸遇上超时,需要检查 key 是否出现在目的实例上。

如果有其它错误发生,那么 MIGRATE 保证 key 只会出现在当前实例中。(当然,目标实例的给定数据库上可能有和 key 同名的键,不过这和 MIGRATE 命令没有关系)。

如果源实例中没有要迁移的key,返回NOKEY 。比如键过期的情况,NOKEY并不是一个错误。

*一次迁移多个 key

Redis 3.0.6 起MIGRATE 支持批量迁移。需要使用 KEYS 选项,使用空字符串替换 key,要迁移的 key 列在 KEYS 命令之后:

MIGRATE 192.168.1.34 6379 "" 0 5000 KEYS key1 key2 key3

当所有 key 都不存在时返回 NOKEY ,即使只有一个key存在也执行成功。

*Options

  • COPY -- 复制,不删除源实例中的 key。
  • REPLACE -- 替换,替换目标实例中的存在的 key。
  • KEYS -- 如果 key 参数是一个空字符串,会迁移 KEYS 命令后所有的 key 。
  • AUTH -- 使用密码访问目标数据库。
  • AUTH2 -- 使用用户名和密码对访问数据库。 (Redis 6 以上 ACL auth )。

*历史

  • >= 3.0.0: 增加 COPYREPLACE 选项。
  • >= 3.0.6: 增加 KEYS 选项。
  • >= 4.0.7: 增加 AUTH 选项。
  • >= 6.0.0: 增加 AUTH2 选项。

*返回值

字符串: 迁移成功时返回 OK ,如果在源实例中找不到 key 返回 NOKEY