*Redis MIGRATE 命令

原子地将 key 从当前 Redis 实例迁移到目标实例。支持多种迁移模式和选项。


*语法

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

*参数说明

参数 类型 必填 说明
host String 目标服务器主机
port Integer 目标服务器端口
key String 要迁移的 key,批量迁移时传 ""
destination-db Integer 目标数据库索引
timeout Integer 超时时间(毫秒),0 表示无限阻塞
COPY 标志 保留原 key(复制而非移动)
REPLACE 标志 目标 key 已存在时覆盖
AUTH String 目标服务器密码
AUTH2 String 目标服务器 ACL 用户名和密码(Redis 6.0+)
KEYS String 批量迁移多个 key(Redis 3.0+)

*返回值

条件 返回值
迁移成功 OK
目标 key 已存在且无 REPLACE 错误 BUSYKEY
key 不存在 错误 NOKEY

*时间复杂度

O(1) 命令本身,实际取决于 key 大小和网络延迟。


*示例

# 单个 key 迁移
> MIGRATE 192.168.1.200 6379 mykey 0 5000
OK

# 保留原 key(复制)
> MIGRATE 192.168.1.200 6379 mykey 0 5000 COPY
OK

# 覆盖目标 key
> MIGRATE 192.168.1.200 6379 mykey 0 5000 REPLACE
OK

# 批量迁移
> MIGRATE 192.168.1.200 6379 "" 0 5000 KEYS key1 key2 key3
OK

*常见错误

  1. BUSYKEY:目标 key 已存在且无 REPLACE。
  2. NOKEY:源 key 不存在。

*最佳实践

  1. Slot 迁移(Cluster):Redis Cluster 使用 MIGRATE 进行槽位迁移,命令内部自动处理。
  2. 数据迁移:单机到单机迁移数据时,SCAN + MIGRATE 分批迁移。
  3. 注意 TTL:MIGRATE 会保留 key 的 TTL,但迁移期间的时间差可能导致 TTL 有微小偏差。

*FAQ

Q: MIGRATE 是原子操作吗? A: 是。key 在原实例上被删除(或保留 COPY)并写入目标实例,整个过程原子完成。其他客户端不会看到中间状态。

Q: MIGRATE 支持 Cluster 模式吗? A: 支持。Cluster 节点间槽位迁移内部使用 MIGRATE。

Q: 大 key 迁移会阻塞吗? A: 源和目标实例在序列化/反序列化 key 时都有短暂阻塞。大 key 应分批迁移或考虑其他方案。