迁移
MIGRATE host port <key | ""> destination-db timeout [COPY] [REPLACE] [AUTH password | AUTH2 username password] [KEYS key [key ...]]
- Available since:
- 2.6.0
- Time complexity:
- This command actually executes a DUMP+DEL in the source instance, and a RESTORE in the target instance. See the pages of these commands for time complexity. Also an O(N) data transfer between the two instances is performed.
- ACL categories:
-
@keyspace
,@write
,@slow
,@dangerous
,
原子性地将一个键从源Redis实例传输到目标Redis实例。 成功后,该键将从原始实例中删除,并保证存在于目标实例中。
该命令是原子的,并在传输键所需的时间内阻塞两个实例,在任何给定时间,键将出现在一个实例或另一个实例中,除非发生超时错误。在3.2及以上版本中,可以通过传递空字符串("")作为键并添加KEYS
子句,在单个MIGRATE
调用中管道传输多个键。
该命令内部使用DUMP
生成键值的序列化版本,并使用RESTORE
在目标实例中合成键。
源实例充当目标实例的客户端。
如果目标实例对RESTORE
命令返回OK,源实例将使用DEL
删除键。
超时时间指定了与目标实例通信的任何时刻的最大空闲时间,单位为毫秒。 这意味着操作不需要在指定的毫秒数内完成,但传输应在不超过指定毫秒数的时间内取得进展,而不会阻塞。
MIGRATE
需要执行I/O操作并遵守指定的超时时间。
在传输过程中发生I/O错误或达到超时时间时,
操作将被中止并返回特殊错误 - IOERR
。
当这种情况发生时,可能会出现以下两种情况:
- 密钥可能同时存在于两个实例上。
- 键可能仅在源实例中。
在发生超时的情况下,键不会丢失,但调用MIGRATE
的客户端在发生超时错误时,应检查键是否也存在于目标实例中,并相应地采取行动。
当返回任何其他错误(以ERR
开头)时,MIGRATE
保证键仍然仅存在于源实例中(除非目标实例上已经存在同名的键)。
如果源实例中没有要迁移的键,则返回NOKEY
。
因为在正常情况下,例如由于过期,可能会缺少键,
NOKEY
不是错误。
使用单个命令调用迁移多个键
从 Redis 3.0.6 开始,MIGRATE
支持一种新的批量迁移模式,该模式使用流水线技术来在实例之间迁移多个键,从而避免了每次使用单个 MIGRATE
调用移动每个键时产生的往返时间延迟和其他开销。
为了启用此表单,使用了KEYS
选项,并将普通的key参数设置为空字符串。实际的键名将在KEYS
参数本身之后提供,如下例所示:
MIGRATE 192.168.1.34 6379 "" 0 5000 KEYS key1 key2 key3
当使用此表单时,NOKEY
状态码仅在实例中不存在任何键时返回,否则即使只存在一个键,命令也会被执行。
选项
COPY
-- 不要从本地实例中移除密钥。REPLACE
-- 替换远程实例上的现有键。KEYS
-- 如果键参数是一个空字符串,命令将迁移所有跟随KEYS
选项的键(更多信息请参见上面的部分)。AUTH
-- 使用给定的密码对远程实例进行身份验证。AUTH2
-- 使用给定的用户名和密码对进行身份验证(Redis 6 或更高版本的 ACL 身份验证样式)。
RESP2/RESP3 回复
以下之一:
- Simple string reply: 成功时返回
OK
。 - Simple string reply:
NOKEY
当在源实例中未找到任何键时。
历史
- 从 Redis 版本 3.0.0 开始:添加了
COPY
和REPLACE
选项。 - 从 Redis 版本 3.0.6 开始:添加了
KEYS
选项。 - 从Redis版本4.0.7开始:添加了
AUTH
选项。 - 从 Redis 6.0.0 版本开始:添加了
AUTH2
选项。