在redigo客户端redis池库中旋转密码
我的应用程序正在使用redigo客户端库与redis服务器建立TCP连接。我想在运行时更改redis的密码,并希望redigo库在后续连接中使用新密码。(在redis池中) 我用以下方法定义了我的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
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)。这是修改参数的正确方法吗。?