Go 如何正确关闭redis连接?
我的代码中有redigo池连接。在GetKey函数中,获取conn并最终关闭它。但是会收到恐慌性错误。 以下是池函数:Go 如何正确关闭redis连接?,go,redis,redigo,Go,Redis,Redigo,我的代码中有redigo池连接。在GetKey函数中,获取conn并最终关闭它。但是会收到恐慌性错误。 以下是池函数: func newPool(server string, dbNumber int) *redis.Pool { return &redis.Pool{ MaxIdle: 100, IdleTimeout: 240 * time.Second, MaxActive: 120000, Wait: true, Dial: f
func newPool(server string, dbNumber int) *redis.Pool {
return &redis.Pool{
MaxIdle: 100,
IdleTimeout: 240 * time.Second,
MaxActive: 120000,
Wait: true,
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", server, redis.DialDatabase(dbNumber))
if err != nil {
global.ErrorLogger.Println(err.Error())
return nil, err
}
return c, err
},
TestOnBorrow: func(c redis.Conn, t time.Time) error {
_, err := c.Do("PING")
global.ErrorLogger.Println(err.Error())
return err
},
}
func GetKey(key string, dbnum int) (string, error) {
conn := Pool.Get()
conn.Do("SELECT", dbnum)
defer conn.Close()
var data []byte
data, err := redis.Bytes(conn.Do("GET", key))
if err != nil {
return string(data), fmt.Errorf("error getting key %s: %v", key, err)
}
return string(data), err}
}
下面是getKey函数:
func newPool(server string, dbNumber int) *redis.Pool {
return &redis.Pool{
MaxIdle: 100,
IdleTimeout: 240 * time.Second,
MaxActive: 120000,
Wait: true,
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", server, redis.DialDatabase(dbNumber))
if err != nil {
global.ErrorLogger.Println(err.Error())
return nil, err
}
return c, err
},
TestOnBorrow: func(c redis.Conn, t time.Time) error {
_, err := c.Do("PING")
global.ErrorLogger.Println(err.Error())
return err
},
}
func GetKey(key string, dbnum int) (string, error) {
conn := Pool.Get()
conn.Do("SELECT", dbnum)
defer conn.Close()
var data []byte
data, err := redis.Bytes(conn.Do("GET", key))
if err != nil {
return string(data), fmt.Errorf("error getting key %s: %v", key, err)
}
return string(data), err}
这就是错误:
死机服务192.168.166.135:59694:运行时错误:无效内存地址或零指针取消引用。
github.com/gomodule/redigo/redis.(*Pool).get(0xc0001602a0,0x0,0x0,0xc0002ca0b0,0xc0001127f8)
如果我不关闭conn,我将收到以下错误:
连接池已耗尽
如何正确关闭连接?您确定恐慌来自延迟连接关闭()
pool.Get()。你的恐慌可能来自其他地方。但当我评论延迟连接关闭()
时,一切都很好<代码>延迟连接关闭()
已经是关闭连接的正确方法。您应该提供其他调试详细信息以帮助我们帮助您。如果恐慌真的来自于conn.Close()
那么代码中可能还有一些你没有显示的东西。谢谢。我编辑它