Redis 支持通过遍历 Key 来实现数据迁移,这在热迁移或离线迁移场景中很常见。redis-cli 本身就能实现,无需额外安装工具。它提供了 SCAN 命令(推荐,用于非阻塞遍历 Key)和 MIGRATE 命令(用于迁移单个 Key),结合脚本可以批量处理。以下是详细说明和步骤。
1. 使用 redis-cli 实现遍历 Key 迁移(推荐方法)
-
为什么用 SCAN 而非 KEYS?
KEYS *会扫描所有 Key,但在大 Key 空间中会阻塞 Redis 服务(生产环境忌用)。SCAN是游标式迭代,非阻塞,适合遍历。 -
核心命令:
SCAN 0 MATCH * COUNT 100:从游标 0 开始,匹配所有 Key,每次返回 100 个(可调整)。MIGRATE <target-host> <target-port> <key> <database> <timeout>:将单个 Key 迁移到目标实例,支持在线迁移(Key 在源端删除,目标端插入)。
-
批量脚本示例(Shell 脚本,适用于单机或小规模):
#!/bin/bash SOURCE_HOST="source-redis-host" SOURCE_PORT=6379 TARGET_HOST="target-redis-host" TARGET_PORT=6379 DB=0 # 数据库号 # 使用 SCAN 遍历 Key,并迁移 CURSOR=0 while true; do SCAN_RESULT=$(redis-cli -h $SOURCE_HOST -p $SOURCE_PORT -n $DB SCAN $CURSOR MATCH * COUNT 100) CURSOR=$(echo $SCAN_RESULT | awk '{print $1}') # 更新游标 KEYS=$(echo $SCAN_RESULT | awk '{for(i=2;i<=NF;i++) print $i}') # 提取 Key 列表 for key in $KEYS; do echo "Migrating key: $key" redis-cli -h $SOURCE_HOST -p $SOURCE_PORT -n $DB MIGRATE $TARGET_HOST $TARGET_PORT $key $DB 5000 # 超时 5s done [ $CURSOR -eq 0 ] && break # 游标为 0 时结束 done- 说明:这个脚本在线迁移 Key(源端 Key 被删除)。如果想保留源端数据,用
DUMP+RESTORE代替 MIGRATE(DUMP 序列化 Key 值,RESTORE 到目标)。 - 优点:简单、无需额外工具,支持热迁移(Redis 继续服务)。
- 局限:大实例(百万级 Key)需优化 COUNT 值,避免 OOM;集群环境需指定槽(slot)。
- 说明:这个脚本在线迁移 Key(源端 Key 被删除)。如果想保留源端数据,用
-
备选:DUMP + RESTORE 方式(离线或保留源数据):
- 先用 SCAN 获取 Key 列表,DUMP 每个 Key 到文件。
- 然后在目标端 RESTORE 从文件导入。 示例脚本见搜索结果中的类似实现。
2. 其他专用工具
- RedisShake(阿里巴巴开源):专为 Redis 迁移设计,支持遍历 Key 的在线/离线迁移(RDB/AOF/增量)。配置 YAML 文件指定源/目标,支持过滤 Key 模式(如 MATCH
user:*)。适合集群和大规模场景,比 redis-cli 更高效。- 下载:GitHub redis-shake 项目。
- 用法:
./redis-shake -type=scan -source.host=source-ip -target.host=target-ip。
- RDB Tools 或 redis-rdb-tools:用于 RDB 文件解析和 Key 级迁移,但更偏离线。
- 商业工具:如阿里云/腾讯云的 DCS 迁移工具,内置 Key 遍历。
3. 注意事项
- 性能:遍历百万 Key 可能耗时长,建议分批(按 Hash 槽或前缀)。
- 集群支持:Redis Cluster 用
redis-cli --cluster结合reshard自动迁移槽(包含 Key)。 - 测试:先在测试环境验证,避免数据丢失。监控
INFO replication检查同步状态。 - 如果是版本升级或跨云迁移,优先 RDB/AOF 快照 + 增量。