redigo客户端redis池库中的循环密码

llmtgqce  于 2021-06-09  发布在  Redis
关注(0)|答案(0)|浏览(445)

我的应用程序使用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
}

调用函数时,我面临两个问题:
大量的 curl 连接正在建立,并悬而未决。
重载导致goroutine/螺纹排气。
脚本进程未终止。
你能帮我用一个更好的方法来达到同样的效果吗?提前谢谢。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题