copy_redis.sh 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #!/bin/bash
  2. # 检查参数数量
  3. if [ "$#" -ne 2 ]; then
  4. echo "用法: $0 源数据库 目标数据库"
  5. exit 1
  6. fi
  7. # 获取源数据库和目标数据库
  8. src_db=$1
  9. dst_db=$2
  10. # 初始化游标
  11. cursor=0
  12. # 使用 SCAN 分批次扫描键
  13. while true; do
  14. # 扫描一批键
  15. result=$(redis-cli -n $src_db SCAN $cursor MATCH "*" COUNT 100)
  16. cursor=$(echo "$result" | head -n 1) # 获取新的游标
  17. keys=$(echo "$result" | tail -n +2) # 获取当前批次的键
  18. # 遍历当前批次的键
  19. for key in $keys; do
  20. # 检查键名是否包含源数据库编号,如果是则替换为目标数据库编号
  21. new_key=$(echo "$key" | sed "s/account_${src_db}_/account_${dst_db}_/g")
  22. # 获取键的类型
  23. type=$(redis-cli -n $src_db TYPE "$key")
  24. # 根据类型复制数据
  25. case $type in
  26. "string")
  27. value=$(redis-cli -n $src_db GET "$key")
  28. redis-cli -n $dst_db SET "$new_key" "$value"
  29. ;;
  30. "hash")
  31. fields=$(redis-cli -n $src_db HGETALL "$key")
  32. redis-cli -n $dst_db HMSET "$new_key" $fields
  33. ;;
  34. "list")
  35. elements=$(redis-cli -n $src_db LRANGE "$key" 0 -1)
  36. redis-cli -n $dst_db RPUSH "$new_key" $elements
  37. ;;
  38. "set")
  39. members=$(redis-cli -n $src_db SMEMBERS "$key")
  40. redis-cli -n $dst_db SADD "$new_key" $members
  41. ;;
  42. "zset")
  43. members=$(redis-cli -n $src_db ZRANGE "$key" 0 -1 WITHSCORES)
  44. redis-cli -n $dst_db ZADD "$new_key" $members
  45. ;;
  46. esac
  47. done
  48. # 如果游标为 0,表示扫描完成
  49. if [ "$cursor" -eq 0 ]; then
  50. break
  51. fi
  52. done
  53. echo "数据复制完成!"