MIGRATE

以原子方式将键从一个 Redis 实例传输到另一个 Redis 实例。

语法

MIGRATE host port destination-db timeout [COPY] [REPLACE] [AUTH password | AUTH2 username password] [KEYS key [key ...]]

引入版本:2.6.0

复杂度摘要:O(N)

以原子方式将键从源 Redis 实例传输到目标 Redis 实例。成功后,键将从原始实例中删除,并保证存在于目标实例中。

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

必需参数

host

目标 Redis 实例的主机名或 IP 地址。

port

目标Redis实例的端口。

key | ""

要迁移的键,或者使用 KEYS 选项迁移多个键时为空字符串 ("")。

destination-db

目标实例上要将键迁移到的数据库索引。

timeout

传输的最大空闲时间,以毫秒为单位。

可选参数

COPY

不要从本地实例中删除键。

REPLACE

替换目标实例上的现有键。

AUTH password

使用给定密码对目标实例进行身份验证。 AUTH 和 AUTH2 是互斥的。

AUTH2 username password

使用给定的用户名和密码对目标实例进行身份验证(ACL 样式身份验证、Redis 6 或更高版本)。

KEYS key [key ...]

迁移所有列出的键。当键参数为空字符串 ("") 时使用此选项。

详细说明

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

超时指定与目标实例通信的任何时刻的最大空闲时间(以毫秒为单位)。这意味着操作不需要在指定的毫秒数内完成,但传输应该继续进行,而不会阻塞超过指定的毫秒数。

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

  • 键可能位于两个实例上。
  • 键可能仅存在于源实例中。

超时时键不可能丢失,但调用 MIGRATE 的客户端在发生超时错误时应检查目标实例中是否存在 也 键并采取相应措施。

当返回任何其他错误时(从 ERR 开始),MIGRATE 保证该键仍然仅存在于原始实例中(除非具有相同名称的键也存在于目标实例上的 已经)。

如果源实例中没有要迁移的键,则返回 NOKEY。因为在正常情况下可能会丢失键,例如从到期日起,NOKEY 不是错误。

使用单个命令调用迁移多个键

从 Redis 3.0.6 开始,MIGRATE 支持新的批量迁移模式,该模式使用管道技术在实例之间迁移多个键,而不会产生往返时间延迟以及使用单个 MIGRATE 调用移动每个键时出现的其他开销。

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

MIGRATE 192.168.1.34 6379 "" 0 5000 KEYS key1 key2 key3

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

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
❌ 标准
❌主动-主动
❌ 标准
❌主动-主动

返回值

RESP2

以下之一: * 简单字符串回复:OK 成功。 * 简单字符串回复:当在源实例中找不到键时,NOKEY。

RESP3

以下之一: * 简单字符串回复:OK 成功。 * 简单字符串回复:当在源实例中找不到键时,NOKEY。

资料来源:Redis 官方 MIGRATE 文档;中文内容参考 Redis 文档许可。