MIGRATE

用法
MIGRATE host port 〈 key | "" 〉 destination-db timeout [ COPY ] [ REPLACE ] [ AUTH auth | AUTH2 username password ] [ KEYS keys ] [ [ KEYS keys ] ... ]
复杂度
此命令实际上在源实例中执行 DUMP+DEL,并在目标实例中执行 RESTORE。有关时间复杂度,请参阅这些命令的页面。此外,还会在两个实例之间执行 O(N) 数据传输。
2.6.0
ACL 类别
@keyspace, @dangerous, @write, @slow

原子性地将一个键从源 Valkey 实例传输到目标 Valkey 实例。成功后,该键将从原始实例中删除,并保证存在于目标实例中。

此命令是原子性的,并会在传输键所需的时间内阻塞两个实例,在任何给定时间,该键将显示为存在于给定实例或另一个实例中,除非发生超时错误。在 3.2 及更高版本中,可以通过将空字符串 ("") 作为键并添加 !KEYS 子句,在一次 MIGRATE 调用中管道传输多个键。

此命令内部使用 DUMP 生成键值的序列化版本,并使用 RESTORE 在目标实例中合成键。源实例充当目标实例的客户端。如果目标实例对 RESTORE 命令返回 OK,则源实例使用 DEL 删除该键。

超时参数指定与目标实例通信过程中任何时刻的最大空闲时间(以毫秒为单位)。这意味着操作不必在指定毫秒数内完成,而是传输应在不阻塞超过指定毫秒数的情况下进行。

MIGRATE 操作于当前连接中选定的数据库。在调用 MIGRATE 之前,您可以使用 SELECT <dbid> 切换数据库,该命令将从该数据库迁移键。

MIGRATE 需要执行 I/O 操作并遵守指定的超时。如果在传输过程中发生 I/O 错误或达到超时,则操作将中止并返回特殊错误 - IOERR。发生这种情况时,可能出现以下两种情况:

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

在超时情况下,键不可能丢失,但调用 MIGRATE 的客户端在发生超时错误时,应检查键是否也存在于目标实例中,并据此采取行动。

当返回任何其他错误(以 ERR 开头)时,MIGRATE 保证键仍仅存在于原始实例中(除非目标实例中已经存在同名键)。

如果源实例中没有要迁移的键,则返回 NOKEY。由于在正常情况下(例如因过期)可能会出现缺少的键,因此 NOKEY 不是错误。

通过单次命令调用迁移多个键

MIGRATE 支持批量迁移模式,该模式使用管道传输,以便在实例之间迁移多个键,而无需承担单独调用 MIGRATE 移动每个键所产生的往返时间延迟和其他开销。

为了启用此形式,使用 !KEYS 选项,并将普通 key 参数设置为空字符串。实际的键名将在 !KEYS 参数本身之后提供,如下例所示:

MIGRATE 192.168.1.34 6379 "" 0 5000 KEYS key1 key2 key3

使用此形式时,仅当实例中不存在任何键时才返回 NOKEY 状态码,否则即使只存在一个键,命令也会执行。

选项

  • !COPY -- 不从本地实例中删除键。
  • REPLACE -- 替换远程实例上已存在的键。
  • !KEYS -- 如果键参数为空字符串,则命令将改为迁移 !KEYS 选项后面的所有键(有关详细信息,请参阅上一节)。
  • !AUTH -- 使用给定密码向远程实例进行身份验证。
  • AUTH2 -- 使用给定的用户名和密码对进行身份验证。

RESP2/RESP3 回复

以下之一

历史

版本 更改
3.0.0

添加了 COPYREPLACE 选项。

3.0.6

添加了 KEYS 选项。

4.0.7

添加了 AUTH 选项。

6.0.0

添加了 AUTH2 选项。