在Redigo Client Redis池库中旋转密码

问题描述

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

我已经通过以下方式定义了我的redis-pool对象。

 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
}

调用函数时我遇到两个问题:

  1. 许多卷曲连接已建立并悬空了。
  2. 负载导致goroutine /线程耗尽。
  3. 脚本过程不会终止。

您能以一种更好的方法帮助我实现相同目标吗? 预先感谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)