结论:Redis Key 迁移高效方法包括使用 SCAN 命令渐进式扫描避免阻塞、结合 Redis RDB/AOF 文件快照全量迁移、管道(PIPELINE)批量传输数据、RDB 加载后增量同步以最小化停机时间。对于大集群,优先采用 Redis Sentinel 或 Cluster 的内置迁移工具结合脚本自动化,确保数据一致性和高可用。
方法一:使用 SCAN 命令渐进式迁移
在使用 Redis 的 SCAN 命令进行键迁移时,可以避免使用 KEYS * 这种阻塞命令。SCAN 命令允许非阻塞地迭代整个键空间。通过多次调用 SCAN,每次获取一部分键,然后使用 MIGRATE 命令将这些键迁移到目标实例。这样可以大大减少对主实例的阻塞时间,尤其适合线上环境。
管道批量传输数据
在迁移过程中,使用 Redis 的 PIPELINE 功能可以批量发送多个命令,大幅提升传输效率。客户端脚本中,将多个 GET 和 SET 操作打包成一个 PIPELINE 发送到目标 Redis,避免了网络往返延迟。对于海量 Key,PIPELINE 可以将吞吐量提升 10 倍以上。
RDB 快照全量迁移
Redis 的 RDB 快照是迁移最简单高效的方式。停止写操作后,执行 BGSAVE 生成 RDB 文件,直接复制到目标实例,然后用 redis-server --dbfilename new.rdb 加载。新实例启动后,通过主从复制方式追赶增量数据,实现零数据丢失。
Redis Cluster 迁移技巧
在 Redis Cluster 环境中,使用 cluster migrate 命令或 redis-cli --cluster rebalance 可以自动均衡槽位和 Key。但对于手动迁移,建议先用 redis-cli --scan --pattern 'prefix*' | xargs -P 8 -n 200 redis-cli migrate 命令,并发迁移指定前缀的 Key,结合 --pipeline 选项优化。
增量同步最小化停机
迁移分两阶段:第一阶段全量 RDB 迁移,第二阶段开启主从复制同步增量变更。切换时,使用 SLAVEOF no one 提升从库为主库,整个过程停机时间仅秒级。通过脚本监控 binlog 延迟,确保同步完成后再切流量。
工具辅助:redis-migrate-tool
开源工具 redis-migrate-tool 支持 SCAN + PIPELINE + MIGRATE 组合,提供 --pipe-block-size 等参数优化。通过 redis-migrate-tool dump 原库 dump.rdb,然后 load 到目标库,支持多线程并发,适合 TB 级数据迁移。
常见问题 FAQ
Q: 迁移时如何避免数据丢失?
A: 使用 RDB 全量 + 主从增量同步,确保双写期间一致性,切换前验证同步延迟为 0。
Q: KEYS * 命令为什么不适合生产?
A: 它会阻塞整个实例,O(N) 时间复杂度,对于亿级 Key 会导致秒级甚至分钟级阻塞,用 SCAN 替换。
Q: 大 Key 如何处理?
A: 预先用 redis-cli --bigkeys 扫描大 Key,分拆或单独迁移,使用 SCAN 的 MATCH 过滤。
Q: 迁移后如何验证完整性?
A: 比较两端 Key 数量、随机抽样值一致性,或用 redis-check-aof/rdb 校验文件完整。