MIGRATE
MIGRATE host port <key | ""> destination-db timeout [COPY] [REPLACE] [AUTH password | AUTH2 username password] [KEYS key [key ...]]
- 可用版本
- Redis Open Source 2.6.0
- 时间复杂度
- 此命令实际上在源实例上执行 DUMP+DEL 操作,并在目标实例上执行 RESTORE 操作。请参阅这些命令的页面以了解时间复杂度。此外,还在两个实例之间执行 O(N) 数据传输。
- ACL 类别
-
@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 回复
以下之一
历史
- 从 Redis 3.0.0 版本开始:添加了
COPY
和REPLACE
选项。 - 从 Redis 3.0.6 版本开始:添加了
KEYS
选项。 - 从 Redis 4.0.7 版本开始:添加了
AUTH
选项。 - 从 Redis 6.0.0 版本开始:添加了
AUTH2
选项。