单键搬运的底层命令
MIGRATE 把一个键连同值原子地搬到目标实例,内部走序列化加目标端重建的流程。集群改槽时由 reshard 工具逐键调用它,手工处理残留键、调整热点键或做单机到单机的灰度搬迁时也会直接用它。
基本信息
| 语法 | MIGRATE host port key 目标库 timeout [COPY] [REPLACE] [AUTH 密码] [KEYS 多个键] |
|---|---|
| 返回值 | 成功返回 OK,键不存在返回 NOKEY |
| 访问权限 | 需要对两端实例都有读写权限 |
| 集群约束 | 目标节点需处于该槽的导入状态,通常由 reshard 流程设置 |
典型使用场景
- 槽迁移收尾:搬运迁移过程中少量残留的键
- 热点调整:把个别大键或热点键定向挪到负载更低的实例
- 单机灰度:把指定键先搬到新实例验证读写路径
- 纠错:把误落在错误节点的键挪回正确分片
使用示例
使用示例
redis-cli -p 7000 MIGRATE 10.0.0.12 7001 user:1001 0 5000 # 迁移单键,超时 5 秒
redis-cli -p 7000 MIGRATE 10.0.0.12 7001 user:1002 0 5000 REPLACE # 目标已存在时覆盖
redis-cli -p 7000 MIGRATE 10.0.0.12 7001 '' 0 5000 KEYS k1 k2 k3 # 批量迁移多个键
redis-cli -p 7000 MIGRATE 10.0.0.12 7001 user:1003 0 5000 COPY # 保留源端键,便于核对
redis-cli -p 7000 GET user:1001 && redis-cli -p 7001 GET user:1001 # 核对两端数据选项与返回
| 项 | 含义 | 注意点 |
|---|---|---|
| COPY | 迁移后保留源端键 | 用于先核对再清理,会多占一份内存 |
| REPLACE | 目标端已有同名键时覆盖 | 默认不覆盖,冲突时报 BUSYKEY |
| AUTH / AUTH2 | 目标实例需要认证时提供凭据 | AUTH2 用于带用户名的账号认证 |
| timeout | 连接与传输的超时毫秒数 | 设为 0 表示不限制,容易长时间卡住 |
| OK | 迁移成功且源端键已删除 | COPY 模式下源端键保留 |
| NOKEY | 键不存在,未做任何改动 | 槽迁移收尾时常见,可安全忽略 |
| BUSYKEY | 目标端存在同名键且未加 REPLACE | 先确认内容再决定是否覆盖 |
批量迁移时键参数写空字符串,真正要迁移的键通过 KEYS 选项给出;批量模式不支持 REPLACE,目标端已有同名键会直接返回冲突错误。
集群里手工迁移一个键之后,如果该槽仍处于迁移中间状态,客户端访问可能收到重定向提示,这属于流程的正常部分;收尾时应确认槽状态回到稳定态。
MIGRATE 是同步阻塞操作:源端要序列化,目标端要重建数据,传输期间两端都被占用。大键会明显抬高延迟并可能触发超时,务必挑低峰执行并先评估键的体积。