问题描述
我的应用程序正在使用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
}
- 许多卷曲连接已建立并悬空了。
- 高负载导致goroutine /线程耗尽。
- 脚本过程不会终止。
您能以一种更好的方法帮助我实现相同目标吗? 预先感谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)