首页/数据/Redis 进阶速查/MIGRATE:跨节点迁移键

MIGRATE:跨节点迁移键

MIGRATE host port key dbid timeout 把键连同值迁移到目标实例,支持 COPY/REPLACE 选项;集群槽迁移的底层就是 MIGRATE 逐键搬运。

Redis 进阶速查数据更新于 2026-10-13

单键搬运的底层命令

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 是同步阻塞操作:源端要序列化,目标端要重建数据,传输期间两端都被占用。大键会明显抬高延迟并可能触发超时,务必挑低峰执行并先评估键的体积。

易错点

  • 直接迁移大键:单次操作阻塞两端,超时后可能键已落到目标端而源端未删,出现重复数据,应拆分或选择低峰执行
  • 目标端已有同名键又不加 REPLACE:返回冲突错误迁移中止,脚本若不检查返回值会误以为已经完成
  • 未提供认证凭据:目标端拒绝连接,错误体现在返回值里,批量脚本必须逐条校验返回码
  • 迁移后不核对源端是否已删除:COPY 模式与覆盖选项搭配使用不一致时容易留下两份数据

数据来源与参考

  • Redis 官方文档:MIGRATE 命令
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌