将 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 )。
*历史
*返回值
字符串: 迁移成功时返回 OK ,如果在源实例中找不到 key 返回 NOKEY
。