*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
*常见错误
- BUSYKEY:目标 key 已存在且无 REPLACE。
- NOKEY:源 key 不存在。
*最佳实践
- Slot 迁移(Cluster):Redis Cluster 使用 MIGRATE 进行槽位迁移,命令内部自动处理。
- 数据迁移:单机到单机迁移数据时,SCAN + MIGRATE 分批迁移。
- 注意 TTL:MIGRATE 会保留 key 的 TTL,但迁移期间的时间差可能导致 TTL 有微小偏差。
*FAQ
Q: MIGRATE 是原子操作吗? A: 是。key 在原实例上被删除(或保留 COPY)并写入目标实例,整个过程原子完成。其他客户端不会看到中间状态。
Q: MIGRATE 支持 Cluster 模式吗? A: 支持。Cluster 节点间槽位迁移内部使用 MIGRATE。
Q: 大 key 迁移会阻塞吗? A: 源和目标实例在序列化/反序列化 key 时都有短暂阻塞。大 key 应分批迁移或考虑其他方案。