redis集群数据迁移到单节点或哨兵模式上-快速复用

背景:

网上基本是都是通过rdb、aof、或者用redis-dump来实现数据迁移,步骤都挺复杂的,完全可以通过go直接编译一个可执行程序来实现可快实现快速迁移。

注意点:

由于集群模式数据是分散的,所以复制的过程还需要考虑MOVED的情况

内容:

1、安装依赖库

go get github.com/go-redis/redis

2.代码内容

下面是参考代码,可以修改ip、端口与密码参数并根据自己需要进行调整

package main

import (
    "fmt"
    "log"
    "strings"

    "github.com/go-redis/redis"
)

func main() {
    // 连接源 Redis 集群
    sourceClient := redis.NewClusterClient(&redis.ClusterOptions{
        Addrs:    []string{"172.16.0.12:7001", "172.16.0.12:7002", "172.16.0.12:7003", "172.16.0.15:7001", "172.16.0.15:7002", "172.16.0.15:7003"},
        Password: "auth-password",
    })

    // 连接目标 Redis 服务器
    destClient := redis.NewClient(&redis.Options{
        Addr:     "目标RedisIP:目标Redis端口",
        Password: "auth-password",
    })

    // 获取源 Redis 集群中的所有键
    keys, err := sourceClient.Keys("*").Result()
    if err != nil {
        log.Fatal(err)
    }

    // 遍历所有键并导入到目标 Redis 服务器
    for _, key := range keys {
        val, err := sourceClient.Get(key).Result()
        if err != nil {
            log.Printf("Failed to get key %s: %v", key, err)
            continue
        }

        err = destClient.Set(key, val, 0).Err()
        if err != nil {
            if strings.Contains(err.Error(), "MOVED") {
                parts := strings.Fields(err.Error())
                addr := parts[2]
                sourceClient := redis.NewClusterClient(&redis.ClusterOptions{
                    Addrs:    []string{addr},
                    Password: "auth-password",
                })
                val, err := sourceClient.Get(key).Result()
                if err != nil {
                    log.Printf("Failed to get key %s: %v", key, err)
                    continue
                }
                err = destClient.Set(key, val, 0).Err()
                if err != nil {
                    log.Printf("Failed to set key %s: %v", key, err)
                    continue
                }
                fmt.Printf("Key %s moved from %s, successfully imported.\n", key, addr)
            } else {
                log.Printf("Failed to set key %s: %v", key, err)
                continue
            }
        }
        fmt.Printf("Key %s imported successfully.\n", key)
    }

    fmt.Println("Data migration completed.")
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值