#!/bin/bash # 检查参数数量 if [ "$#" -ne 2 ]; then echo "用法: $0 源数据库 目标数据库" exit 1 fi # 获取源数据库和目标数据库 src_db=$1 dst_db=$2 # 初始化游标 cursor=0 # 使用 SCAN 分批次扫描键 while true; do # 扫描一批键 result=$(redis-cli -n $src_db SCAN $cursor MATCH "*" COUNT 100) cursor=$(echo "$result" | head -n 1) # 获取新的游标 keys=$(echo "$result" | tail -n +2) # 获取当前批次的键 # 遍历当前批次的键 for key in $keys; do # 检查键名是否包含源数据库编号,如果是则替换为目标数据库编号 new_key=$(echo "$key" | sed "s/account_${src_db}_/account_${dst_db}_/g") # 获取键的类型 type=$(redis-cli -n $src_db TYPE "$key") # 根据类型复制数据 case $type in "string") value=$(redis-cli -n $src_db GET "$key") redis-cli -n $dst_db SET "$new_key" "$value" ;; "hash") fields=$(redis-cli -n $src_db HGETALL "$key") redis-cli -n $dst_db HMSET "$new_key" $fields ;; "list") elements=$(redis-cli -n $src_db LRANGE "$key" 0 -1) redis-cli -n $dst_db RPUSH "$new_key" $elements ;; "set") members=$(redis-cli -n $src_db SMEMBERS "$key") redis-cli -n $dst_db SADD "$new_key" $members ;; "zset") members=$(redis-cli -n $src_db ZRANGE "$key" 0 -1 WITHSCORES) redis-cli -n $dst_db ZADD "$new_key" $members ;; esac done # 如果游标为 0,表示扫描完成 if [ "$cursor" -eq 0 ]; then break fi done echo "数据复制完成!"