我的应用程序使用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/螺纹排气。
脚本进程未终止。
你能帮我用一个更好的方法来达到同样的效果吗?提前谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!