Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在redigo客户端redis池库中旋转密码_Go_Redis_Passwords_Redigo - Fatal编程技术网

在redigo客户端redis池库中旋转密码

在redigo客户端redis池库中旋转密码,go,redis,passwords,redigo,Go,Redis,Passwords,Redigo,我的应用程序正在使用redigo客户端库与redis服务器建立TCP连接。我想在运行时更改redis的密码,并希望redigo库在后续连接中使用新密码。(在redis池中) 我用以下方法定义了我的redis池对象来实现这一点 return &redis.Pool{ MaxIdle: 5, MaxActive: 1000, IdleTimeout: time.Minute, Dial: func() (redis

我的应用程序正在使用redigo客户端库与redis服务器建立TCP连接。我想在运行时更改redis的密码,并希望redigo库在后续连接中使用新密码。(在redis池中)

我用以下方法定义了我的redis池对象来实现这一点

 return &redis.Pool{
        MaxIdle:     5,
        MaxActive:   1000,
        IdleTimeout: time.Minute,
        Dial: func() (redis.Conn, error) {
            cErr = getRedisPassword()
            if cErr != nil {
                return nil, cErr
            }

                   if gRedisAuthPassword != "" {
                           opts[1] =  redis.DialPassword(gRedisAuthPassword)
                   }
            return redis.Dial("tcp", addr, opts...)
        },
        TestOnBorrow: func(c redis.Conn, t time.Time) error {
            _, err := c.Do("PING")
            cErr = err
            return err
        },
    }, nil
调用函数时的选项包括:

  cluster := &redisc.Cluster{
        StartupNodes: nodesInfo,
        DialOptions:  []redis.DialOption{redis.DialConnectTimeout(5 * time.Second), redis.DialPassword(gRedisAuthPassword)},
        CreatePool:   createPool,
getRedisPassword函数如下所示:该函数调用获取redis集群最新密码的脚本

func getRedisPassword() error {
        var cErr error
        cErr = nil

        if ssFlag == "YES" {
             cmd := exec.Command("/bin/bash", "-c", "/opt/lte/etc/utility/fetch_redisPassword.sh")
             pass, err := cmd.CombinedOutput()
             gRedisAuthPassword = string(pass)
             cErr = err

             // Wait for the process to finish or kill it after a timeout (whichever happens first):
             done := make(chan error, 1)
             go func() {
                     done <- cmd.Wait()
             }()
                  select {
                          case <-time.After(3 * time.Second):
                                  if err := cmd.Process.Kill(); err != nil {
                                   fmt.Println("error:", err)
                                  }
                          case err := <-done:
                                    if err != nil {
                                    fmt.Println("error:", err)
                                        }
                  }
        } else {
                return cErr
        }

        if cErr != nil || gRedisAuthPassword == "null" || gRedisAuthPassword == "" {
          //print log
                        cErr = ErrDbConnFailed
        }

        return cErr
}
func getRedisPassword()错误{
var-cErr误差
cErr=零
如果ssFlag==“是”{
cmd:=exec.Command(“/bin/bash”、“-c”、“/opt/lte/etc/utility/fetch\u redisPassword.sh”)
通过,错误:=cmd.CombinedOutput()
gRedisAuthPassword=字符串(通过)
cErr=错误
//等待进程完成或在超时后终止(以先发生的为准):
完成:=生成(chan错误,1)
go func(){

完成调整池参数以减少连接拨号。移动/opt/lte/etc/utility/fetch\u redisPassword.sh执行的任何操作的to Go代码。旁白:CombinedOutput在命令完成后返回(否则它如何返回其输出?)。以后调用Wait没有意义,超时代码也没有任何作用。请使用CommandContext强制执行超时。尽管如此,我同意您可能应该在Go中实现shell脚本所做的一切。@Peter谢谢。我还想知道修改代码是否正确?行--opts[1]=redis.DialPassword(gredisauthspassword)。这是修改参数的正确方法吗?调整池参数以减少连接拨号。移动/opt/lte/etc/utility/fetch\u redisPassword.sh所做的任何操作的to Go代码。旁白:CombinedOutput在命令完成后返回(否则它如何返回其输出?)。以后调用Wait没有意义,超时代码也没有任何作用。请使用CommandContext强制执行超时。尽管如此,我同意您可能应该在Go中实现shell脚本所做的一切。@Peter谢谢。我还想知道修改代码是否正确?行--opts[1]=redis.DialPassword(gRedisAuthPassword)。这是修改参数的正确方法吗。?