redis migrate命令


MIGRATE host port key|”” destination-db timeout [COPY] [REPLACE] [KEYS key [key …]]

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

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

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

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

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

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

  • key 可能存在于两个实例
  • key 可能只存在于当前源实例

唯一不可能发生的情况就是丢失 key ,因此,如果一个客户端执行 MIGRATE 命令,并且不幸遇上 IOERR 错误,那么这个客户端唯一要做的就是检查自己数据库上的 key 是否已经被正确地删除。

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

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

*一次迁移多个key

需要使用 KEYS 选项, 使用空字符串替换 key,要迁移的key列在KEYS命令之后:

MIGRATE 192.168.1.34 6379 "" 0 5000 KEYS key1 key2 key3

*可选项

  • COPY — 不移除源实例上的 key 。
  • REPLACE — 替换目标实例上已存在的 key 。
  • KEYS — 如果 key 参数是一个空字符串,会迁移 KEYS 命令后所有的 key 。

COPY and REPLACE 在Redis 3.0版本以上有效。 KEYS 在 Redis 3.0.6 版本以上有效

*返回值

字符串: 迁移成功时返回 OK ,否则返回相应的错误。