Redis MIGRATE 命令详细教程
MIGRATE 用于将一个或多个 Key 从当前 Redis 实例原子地迁移到另一个 Redis 实例。迁移过程中 Key 不会同时存在于两个实例,操作是原子的:在任意时刻,Key 要么在源实例,要么在目标实例。MIGRATE 常用于在线数据迁移、集群扩容、数据搬迁等场景。
本文基于 Redis 通用 Key 操作介绍
MIGRATE。Redis 命令本身不区分大小写,因此MIGRATE、migrate和Migrate的效果相同;文档统一使用大写形式。MIGRATE自 Redis 2.6 起可用,COPY、REPLACE选项从 Redis 3.0 开始支持,KEYS选项从 Redis 3.0.6 开始支持,AUTH从 Redis 4.0 开始支持,AUTH2从 Redis 6.0 开始支持。
资料合集:https://pan.quark.cn/s/10e98d308913、https://pan.quark.cn/s/f56bc69c5338
一、命令概览
1. 基本语法
redis
MIGRATE host port key|"" destination-db timeout
[COPY] [REPLACE]
[AUTH password | AUTH2 username password]
[KEYS key [key ...]]
参数说明:
| 参数 | 说明 |
|---|---|
host |
目标 Redis 实例的主机地址 |
port |
目标 Redis 实例的端口 |
key |
要迁移的单个 Key,或使用空字符串 "" 配合 KEYS 选项迁移多个 Key |
destination-db |
目标实例的逻辑数据库编号(如 0、1) |
timeout |
超时时间,单位为毫秒,是 I/O 操作的最大等待时间 |
COPY |
迁移后不在源端删除 Key(默认行为是删除源端 Key) |
REPLACE |
替换目标实例上已存在的同名 Key(默认遇到同名 Key 会返回错误) |
AUTH password |
目标实例的密码认证(Redis 4.0+) |
AUTH2 username password |
目标实例的 ACL 用户名和密码认证(Redis 6.0+) |
KEYS key [key ...] |
迁移多个 Key,此时 key 参数传空字符串 "" |
返回值:
| 场景 | 返回值 |
|---|---|
| 迁移成功 | OK |
| 源端 Key 不存在 | NOKEY |
2. 最简单的示例
假设目标实例运行在 192.168.1.100:6380,将当前实例的 user:1001 迁移过去:
redis
SET user:1001 "Alice"
MIGRATE 192.168.1.100 6380 user:1001 0 5000
返回:
text
OK
迁移成功后,user:1001 从当前实例删除,出现在目标实例的 DB 0 中。
在目标实例上验证:
redis
SELECT 0
GET user:1001
返回:
text
"Alice"
二、MIGRATE 的基本用法
1. 迁移单个 Key
redis
SET session:abc123 "token-data"
MIGRATE 192.168.1.100 6380 session:abc123 0 5000
返回 OK 表示迁移成功。迁移后:
- 源端:
session:abc123不存在(EXISTS返回0)。 - 目标端(DB 0):
session:abc123存在(EXISTS返回1)。
2. 源端 Key 不存在
迁移不存在的 Key:
redis
MIGRATE 192.168.1.100 6380 no-such-key 0 5000
返回:
text
NOKEY
NOKEY 表示源端没有找到指定的 Key,迁移未执行。
3. 迁移到不同的逻辑数据库
将 Key 迁移到目标实例的 DB 1:
redis
SET cache:item "data"
MIGRATE 192.168.1.100 6380 cache:item 1 5000
迁移后 Key 出现在目标实例的 DB 1 中。
4. 超时时间
timeout 单位为毫秒,是 I/O 操作(连接、传输)的最大等待时间。对于大 Key 的迁移,需要设置较大的超时时间:
redis
MIGRATE 192.168.1.100 6380 big-list-key 0 30000
设置 30 秒超时。超时后迁移可能失败或返回错误。
5. COPY --- 保留源端 Key
默认情况下 MIGRATE 会从源端删除 Key。使用 COPY 选项后,源端 Key 不会被删除:
redis
SET user:1001 "Alice"
MIGRATE 192.168.1.100 6380 user:1001 0 5000 COPY
迁移后:
- 源端:
user:1001仍然存在。 - 目标端:
user:1001也存在。
相当于复制 Key 到目标实例。
6. REPLACE --- 替换目标端同名 Key
默认情况下,如果目标端已存在同名 Key,MIGRATE 会返回错误。使用 REPLACE 选项可以强制覆盖:
redis
MIGRATE 192.168.1.100 6380 user:1001 0 5000 REPLACE
迁移后目标端的同名 Key 会被新值覆盖。
7. COPY 和 REPLACE 组合使用
redis
MIGRATE 192.168.1.100 6380 user:1001 0 5000 COPY REPLACE
保留源端 Key,同时覆盖目标端的同名 Key。
三、迁移多个 Key
从 Redis 3.0.6 开始,可以使用 KEYS 选项迁移多个 Key。此时 key 参数传空字符串 "":
1. 基本用法
redis
SET user:1001 "Alice"
SET user:1002 "Bob"
SET user:1003 "Charlie"
MIGRATE 192.168.1.100 6380 "" 0 5000 KEYS user:1001 user:1002 user:1003
返回:
text
OK
三个 Key 同时迁移到目标实例。如果在迁移过程中任何一个 Key 在源端被修改或删除,整个迁移操作会失败。
2. 部分 Key 不存在
多 Key 迁移时,部分 Key 不存在不会导致失败,不存在的 Key 会被跳过:
redis
MIGRATE 192.168.1.100 6380 "" 0 5000 KEYS user:1001 not-exist user:1002
存在的 Key 正常迁移,not-exist 被跳过。如果所有 Key 都不存在,返回 NOKEY。
3. 与通配符的区别
KEYS 选项接受的是明确的 Key 列表,不是 glob 模式。不能直接使用 user:* 作为模式:
redis
# 错误:user:* 不是通配符模式,而是字面 Key 名称
MIGRATE 192.168.1.100 6380 "" 0 5000 KEYS user:*
# 正确:使用 SCAN 获取 Key 列表,然后逐批迁移
如需按模式迁移,先用 SCAN 获取匹配的 Key 列表,再批量传入 MIGRATE:
redis
SCAN 0 MATCH user:* COUNT 100
# 获取 Key 列表后:
MIGRATE 192.168.1.100 6380 "" 0 5000 KEYS user:1001 user:1002 user:1003
四、认证选项
1. AUTH --- 密码认证
目标实例设置了 requirepass 时,使用 AUTH 选项提供密码(Redis 4.0+):
redis
MIGRATE 192.168.1.100 6380 user:1001 0 5000 AUTH "mysecret"
2. AUTH2 --- 用户名和密码认证
目标实例启用了 ACL(Redis 6.0+),使用 AUTH2 选项提供用户名和密码:
redis
MIGRATE 192.168.1.100 6380 user:1001 0 5000 AUTH2 "migrate-user" "mysecret"
3. AUTH 与 AUTH2 不能同时使用
AUTH 和 AUTH2 互斥,根据目标实例的认证方式选择其一。
五、MIGRATE 的原子性
1. 原子迁移保证
MIGRATE 是原子操作。在迁移过程中,Key 在源端和目标端的状态变化如下:
| 阶段 | 源端状态 | 目标端状态 |
|---|---|---|
| 迁移前 | Key 存在 | Key 不存在(或不使用 REPLACE 时报错) |
| 序列化传输中 | Key 仍存在 | Key 不存在 |
| 目标端写入完成 | Key 仍存在 | Key 存在 |
| 源端删除完成 | Key 已删除 | Key 存在 |
在任意时刻,Key 要么存在于源端,要么存在于目标端(或极短的"两者都存在"过渡状态)。
2. 失败回滚
如果迁移过程中发生错误(如目标端不可达、超时等),MIGRATE 会:
- 返回错误信息。
- 源端 Key 不受影响(仍然存在)。
- 目标端可能没有 Key(如果迁移未完成)。
3. 大 Key 的迁移
大 Key(如包含百万元素的 Hash、List、Set)的迁移可能需要较长时间。MIGRATE 的实现方式是:
- 在源端执行
DUMP序列化 Key 的值。 - 将序列化数据传输到目标端。
- 在目标端执行
RESTORE反序列化并恢复。 - 确认目标端恢复成功后,从源端删除 Key。
对于大 Key,确保设置足够的 timeout 值,避免因超时导致迁移失败。
六、MIGRATE 与相关命令的区别
1. MIGRATE 与 DUMP + RESTORE
MIGRATE 内部使用的就是 DUMP + RESTORE 的组合,但封装成了原子操作:
text
# MIGRATE 内部等效流程(简化):
DUMP key # 源端序列化
DEL key # 源端删除
RESTORE key 0 <dump-data> # 目标端恢复
手动分步执行 DUMP + RESTORE 不是原子的,中间可能出现数据丢失或竞态条件。优先使用 MIGRATE。
2. MIGRATE 与 COPY
| 特性 | MIGRATE | COPY |
|---|---|---|
| 操作范围 | 跨实例迁移 | 同实例内复制 |
| 源端 Key | 默认删除(COPY 选项保留) | 保留 |
| 目标端 | 另一个 Redis 实例 | 当前实例的不同 Key 名 |
| 原子性 | 原子操作 | 原子操作 |
COPY 用于同实例内复制 Key,MIGRATE 用于跨实例迁移 Key。
3. MIGRATE 与 CLUSTER SETSLOT
在 Redis Cluster 中,CLUSTER SETSLOT 用于槽位迁移。内部也会使用 MIGRATE 来迁移属于该槽位的 Key。MIGRATE 是底层迁移机制,CLUSTER SETSLOT 是集群层面的管理接口。
4. MIGRATE 与 MOVE
MOVE 将 Key 在同一实例的不同逻辑数据库之间移动,而 MIGRATE 跨实例迁移:
redis
MOVE user:1001 1 # 移动到当前实例的 DB 1
MIGRATE 192.168.1.100 6380 user:1001 1 5000 # 迁移到远程实例的 DB 1
| 特性 | MIGRATE | MOVE |
|---|---|---|
| 跨实例 | 是 | 否 |
| 原子性 | 原子 | 原子 |
| 目标端 | 另一个 Redis 实例 | 当前实例的不同 DB |
| 大小限制 | 适合大 Key | 适合单个 Key |
| 适用场景 | 数据搬迁、迁移 | 逻辑库间转移 |
七、不同数据类型的迁移
MIGRATE 可以迁移任意数据类型的 Key,包括 String、Hash、List、Set、Sorted Set、Stream 等。迁移过程对数据类型透明------序列化和反序列化保留了完整的数据类型和内部编码。
redis
HSET user:1001 name "Alice" age 30
MIGRATE 192.168.1.100 6380 user:1001 0 5000
redis
RPUSH queue:jobs job-a job-b job-c
MIGRATE 192.168.1.100 6380 queue:jobs 0 5000
redis
SADD tags redis python java
MIGRATE 192.168.1.100 6380 tags 0 5000
redis
ZADD leaderboard 100 "player1" 200 "player2"
MIGRATE 192.168.1.100 6380 leaderboard 0 5000
迁移后目标端的 Key 保持相同的数据类型和内部结构。
八、过期时间的迁移
MIGRATE 会保留 Key 的过期时间。如果 Key 设置了 TTL(生存时间),迁移后目标端的 Key 仍然会在原定的过期时间点过期。
redis
SET session:abc "token" EX 3600
MIGRATE 192.168.1.100 6380 session:abc 0 5000
迁移后在目标端执行:
redis
TTL session:abc
返回一个正数,表示剩余生存时间。注意:迁移过程耗时会影响剩余 TTL。
注意:过期时间的绝对过期时刻是基于 Unix 时间戳的,如果源端和目标端的系统时间存在差异,可能导致 Key 在目标端的实际过期时间与预期不同。
九、事务、Pipeline 与并发场景
1. 在事务中使用
MIGRATE 是写命令,可以放入事务队列,但由于 MIGRATE 涉及网络 I/O,在事务中使用可能导致长时间阻塞:
redis
MULTI
MIGRATE 192.168.1.100 6380 user:1001 0 5000
MIGRATE 192.168.1.100 6380 user:1002 0 5000
EXEC
不推荐在事务中大量使用 MIGRATE,因为每条 MIGRATE 都是网络操作,事务执行时间可能很长。
2. 多 Key 迁移的原子性
使用 KEYS 选项的多 Key 迁移是原子的------所有指定的 Key 作为一个批次迁移,要么全部成功,要么全部失败(不存在的 Key 被静默跳过)。
3. 并发安全
MIGRATE 本身是原子的,但迁移过程中其他客户端对源端 Key 的修改可能导致迁移失败。例如:
- 源端 Key 在
DUMP后、DEL前被其他客户端修改。 - 源端 Key 在迁移过程中被
EXPIRE过期。
迁移过程中对源端 Key 的并发修改会导致 MIGRATE 返回错误,源端数据保持不变。
4. Pipeline 批量迁移
需要迁移大量 Key 时,可以使用多 Key 的 MIGRATE 分批执行,而不是逐个迁移:
redis
MIGRATE 192.168.1.100 6380 "" 0 5000 KEYS key1 key2 key3 ... key100
每批次控制 Key 数量和总数据大小,避免单次迁移过大导致超时。
十、在常见客户端中的使用方式
1. redis-cli
bash
# 迁移单个 Key
redis-cli MIGRATE 192.168.1.100 6380 user:1001 0 5000
# 带 COPY 选项
redis-cli MIGRATE 192.168.1.100 6380 user:1001 0 5000 COPY
# 带 REPLACE 选项
redis-cli MIGRATE 192.168.1.100 6380 user:1001 0 5000 REPLACE
# 迁移多个 Key
redis-cli MIGRATE 192.168.1.100 6380 "" 0 5000 KEYS user:1001 user:1002 user:1003
# 带认证
redis-cli MIGRATE 192.168.1.100 6380 user:1001 0 5000 AUTH "mysecret"
2. Python(redis-py)
python
import redis
client = redis.Redis(host="localhost", port=6379, decode_responses=True)
client.set("user:1001", "Alice")
# 迁移单个 Key
result = client.migrate("192.168.1.100", 6380, "user:1001", 0, 5000)
print(result) # b'OK'
# 迁移多个 Key
client.set("user:1002", "Bob")
client.set("user:1003", "Charlie")
result = client.migrate(
"192.168.1.100", 6380, "", 0, 5000,
keys=["user:1002", "user:1003"]
)
print(result) # b'OK'
# 带 COPY 和 REPLACE
client.set("cache:item", "data")
result = client.migrate(
"192.168.1.100", 6380, "cache:item", 0, 5000,
copy=True, replace=True
)
print(result)
3. Node.js(node-redis)
javascript
import { createClient } from "redis";
const client = createClient();
await client.connect();
await client.set("user:1001", "Alice");
// 迁移单个 Key
const result = await client.migrate(
"192.168.1.100", 6380, "user:1001", 0, 5000
);
console.log(result); // OK
await client.quit();
4. Java(Jedis)
java
import redis.clients.jedis.Jedis;
try (Jedis jedis = new Jedis("localhost", 6379)) {
jedis.set("user:1001", "Alice");
// 迁移单个 Key
String result = jedis.migrate(
"192.168.1.100", 6380, "user:1001", 0, 5000
);
System.out.println(result); // OK
// 迁移多个 Key
jedis.set("user:1002", "Bob");
jedis.set("user:1003", "Charlie");
result = jedis.migrate(
"192.168.1.100", 6380, 0, 5000,
"user:1002", "user:1003"
);
System.out.println(result); // OK
}
注意:不同客户端对 MIGRATE 的参数封装可能不同,使用前请查阅对应客户端文档。
十一、典型使用场景
1. 在线数据迁移
将数据从旧 Redis 实例迁移到新实例,实现平滑切换:
redis
MIGRATE new-host 6379 user:1001 0 5000
逐个或分批迁移 Key,迁移过程中业务可以继续访问数据(已迁移的 Key 在新实例,未迁移的在旧实例)。
2. 集群扩容
新增 Redis 节点后,将部分 Key 迁移到新节点以实现负载均衡:
redis
MIGRATE new-node-host 7001 "" 0 5000 KEYS cache:a cache:b cache:c
3. 数据备份到另一实例
使用 COPY 选项将数据复制到备份实例:
redis
MIGRATE backup-host 6379 user:1001 0 5000 COPY
源端 Key 保留,目标端获得副本。
4. 跨环境数据搬迁
从开发环境迁移到测试环境,或从测试环境迁移到预发布环境:
redis
MIGRATE test-host 6379 session:abc123 0 5000
5. Redis Cluster 槽位迁移
在 Redis Cluster 中,将一个槽位的数据从源节点迁移到目标节点。Redis 集群内部使用 MIGRATE 来完成 Key 的迁移:
redis
MIGRATE target-node-host target-port key 0 5000
配合 CLUSTER SETSLOT 命令完成槽位迁移流程。
6. 分片数据平衡
根据 Key 的访问热度,将热点 Key 迁移到独立实例:
redis
MIGRATE hotkey-host 6379 hot:counter 0 5000
十二、性能与使用建议
-
时间复杂度:O(N),其中 N 为迁移的 Key 数量。单个 Key 的迁移时间取决于 Key 的大小和网络传输速度。
-
MIGRATE是写命令(ACL 类别为@keyspace、@write、@slow、@dangerous),会修改源端和目标端的数据。 -
合理设置
timeout值。迁移大 Key 时需要更长的超时时间,建议按 Key 大小动态调整:- 小 Key(String):1000-2000 毫秒。
- 中等 Key(数百元素):3000-5000 毫秒。
- 大 Key(数万元素):10000-30000 毫秒甚至更长。
-
迁移大量 Key 时,使用多 Key 的
KEYS选项分批迁移,而不是逐个迁移,减少网络往返。每批次建议不超过数百个 Key 或数 MB 数据。 -
迁移前先评估 Key 大小,避免迁移超大 Key 导致超时:
redisMEMORY USAGE big-key -
如果目标端需要认证,使用
AUTH或AUTH2选项提供凭据。 -
迁移过程中源端和目标端的系统时间差异会影响过期 Key 的行为,确保两端时间同步(如使用 NTP)。
-
生产环境中避免在高峰期执行大量
MIGRATE操作,因为迁移会占用网络带宽和 CPU 资源。 -
如果迁移失败,检查目标实例是否可达、端口是否开放、密码是否正确、目标 DB 是否存在。
-
集群模式下,
MIGRATE可以直接使用,不受槽位限制(但集群层面的槽位迁移应使用CLUSTER SETSLOT流程)。
十三、常见问题排查
问题 1:MIGRATE 返回 IOERR
IOERR 表示在迁移过程中发生了 I/O 错误。可能的原因:
- 目标实例不可达(网络不通、端口未开放)。
- 目标实例内存已满,无法写入。
- 超时时间太短,大 Key 传输未完成。
bash
# 测试目标实例连通性
redis-cli -h 192.168.1.100 -p 6380 PING
解决方案:检查网络连通性、增大 timeout 值、确认目标实例内存充足。
问题 2:MIGRATE 返回 BUSYKEY
BUSYKEY 表示目标端已存在同名 Key。使用 REPLACE 选项强制覆盖:
redis
MIGRATE 192.168.1.100 6380 user:1001 0 5000 REPLACE
问题 3:MIGRATE 返回 NOKEY
NOKEY 表示源端没有找到指定的 Key。可能的原因:
- Key 名称拼写错误或包含不可见字符。
- Key 在当前逻辑数据库中不存在(
SELECT切换的库影响可见范围)。 - Key 已过期或被其他客户端删除。
redis
EXISTS user:1001
SELECT 0
问题 4:MIGRATE 返回 ERR syntax error
语法错误。常见原因:
KEYS选项使用时key参数未传空字符串""。AUTH和AUTH2同时使用。- 参数顺序不正确。
redis
# 正确的多 Key 迁移语法
MIGRATE host port "" db timeout KEYS key1 key2
# 正确的认证语法
MIGRATE host port key db timeout AUTH "password"
问题 5:大 Key 迁移超时
大 Key 的 DUMP + 传输 + RESTORE 过程耗时较长。解决方案:
-
增大
timeout值(如 30000 毫秒或更长)。 -
迁移前检查 Key 大小,预估传输时间:
redisMEMORY USAGE big-key -
对于超大 Key,考虑先在源端拆分(如将大 Hash 分片为多个小 Hash),再分别迁移。
-
如果超时后源端数据仍在,可以重试迁移。
问题 6:迁移后过期时间异常
源端和目标端系统时间不同步会导致过期 Key 的 TTL 行为异常。确保两端使用 NTP 同步时间。迁移后用 TTL 验证:
redis
TTL migrated-key
十四、完整练习
下面的示例演示从准备数据、单个 Key 迁移、多 Key 迁移、COPY 和 REPLACE 选项使用,到验证迁移结果的完整流程。需要两个 Redis 实例(源端 localhost:6379,目标端 localhost:6380):
redis
# 清理源端
FLUSHDB
# 准备数据
SET user:1001 "Alice"
SET user:1002 "Bob"
SET user:1003 "Charlie"
HSET product:2001 name "Phone" price 999
LPUSH queue:jobs job-a job-b
SET session:token "token-data" EX 3600
SET "existing:target" "old-value"
# 1. 迁移单个 Key
MIGRATE 127.0.0.1 6380 user:1001 0 5000
EXISTS user:1001
# 2. 迁移不存在的 Key
MIGRATE 127.0.0.1 6380 no-such-key 0 5000
# 3. 使用 COPY 保留源端
MIGRATE 127.0.0.1 6380 user:1002 0 5000 COPY
EXISTS user:1002
# 4. 多 Key 迁移
MIGRATE 127.0.0.1 6380 "" 0 5000 KEYS user:1003 product:2001
# 5. 迁移带过期的 Key
MIGRATE 127.0.0.1 6380 session:token 0 5000
# 在目标端验证(连接到 6380 端口)
# SELECT 0
# GET user:1001
# GET user:1002
# GET user:1003
# HGETALL product:2001
# LRANGE queue:jobs 0 -1 (注意:queue:jobs 未迁移)
# TTL session:token
# GET existing:target (注意:未迁移,仍为旧值)
# 6. 使用 REPLACE 覆盖目标端同名 Key
# 先在目标端创建同名 Key(在 6380 端口执行)
# SET existing:target "target-value"
# 回到源端迁移并覆盖
MIGRATE 127.0.0.1 6380 existing:target 0 5000 REPLACE
# 7. 迁移不同数据类型
MIGRATE 127.0.0.1 6380 queue:jobs 0 5000
EXISTS queue:jobs
# 验证所有迁移结果
DBSIZE
KEYS *
预期结果:
MIGRATE ... user:1001 ...返回OK,迁移后EXISTS user:1001返回0。MIGRATE ... no-such-key ...返回NOKEY。MIGRATE ... user:1002 ... COPY返回OK,迁移后EXISTS user:1002返回1(COPY 保留源端)。MIGRATE ... KEYS user:1003 product:2001返回OK,两个 Key 被迁移。MIGRATE ... session:token ...返回OK,迁移后目标端TTL session:token返回正数。MIGRATE ... existing:target ... REPLACE返回OK,目标端旧值被覆盖。MIGRATE ... queue:jobs ...返回OK,List 类型成功迁移。- 最终源端剩余 Key 为使用
COPY的user:1002,DBSIZE反映剩余数量。
十五、命令速查表
| 需求 | 命令 |
|---|---|
| 迁移单个 Key 到另一实例 | MIGRATE host port key db timeout |
| 迁移并保留源端 Key | MIGRATE host port key db timeout COPY |
| 迁移并覆盖目标端同名 Key | MIGRATE host port key db timeout REPLACE |
| 迁移多个 Key | MIGRATE host port "" db timeout KEYS key1 key2 ... |
| 带密码认证迁移 | MIGRATE host port key db timeout AUTH "password" |
| 带 ACL 认证迁移 | MIGRATE host port key db timeout AUTH2 "user" "pass" |
| 同实例内复制 Key | COPY source destination |
| 同实例内移动 Key 到另一 DB | MOVE key db |
| 序列化 Key 的值 | DUMP key |
| 从序列化数据恢复 Key | RESTORE key ttl serialized-value |
| 异步删除 Key | UNLINK key [key ...] |
| 集群槽位迁移 | CLUSTER SETSLOT slot NODE node-id |
| 检查 Key 内存占用 | MEMORY USAGE key |
| 测试实例连通性 | PING |
总结
MIGRATE 的核心作用是将 Key 从当前 Redis 实例原子地迁移到另一个 Redis 实例:
redis
MIGRATE host port key|"" destination-db timeout [COPY] [REPLACE] [AUTH password] [KEYS key ...]
使用时重点注意六点:
MIGRATE是原子操作,迁移过程中 Key 不会同时存在于两个实例(COPY选项除外)。- 默认迁移后源端 Key 被删除,使用
COPY选项可保留源端 Key。 - 目标端存在同名 Key 时默认返回
BUSYKEY错误,使用REPLACE选项强制覆盖。 - 多 Key 迁移使用空字符串
""作为key参数,配合KEYS选项传入 Key 列表。 - 合理设置
timeout值,迁移大 Key 时需要更长的超时时间。 - 迁移会保留 Key 的数据类型、内部编码和过期时间,但源端和目标端的系统时间差异可能影响过期 Key 的行为。