Redis 遍历 Key 进行数据迁移的工具与方法

87 阅读2分钟

Redis 支持通过遍历 Key 来实现数据迁移,这在热迁移或离线迁移场景中很常见。redis-cli 本身就能实现,无需额外安装工具。它提供了 SCAN 命令(推荐,用于非阻塞遍历 Key)和 MIGRATE 命令(用于迁移单个 Key),结合脚本可以批量处理。以下是详细说明和步骤。

image.png

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)。
  • 备选: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 Toolsredis-rdb-tools:用于 RDB 文件解析和 Key 级迁移,但更偏离线。
  • 商业工具:如阿里云/腾讯云的 DCS 迁移工具,内置 Key 遍历。

3. 注意事项

  • 性能:遍历百万 Key 可能耗时长,建议分批(按 Hash 槽或前缀)。
  • 集群支持:Redis Cluster 用 redis-cli --cluster 结合 reshard 自动迁移槽(包含 Key)。
  • 测试:先在测试环境验证,避免数据丢失。监控 INFO replication 检查同步状态。
  • 如果是版本升级或跨云迁移,优先 RDB/AOF 快照 + 增量。