Go 如何正确关闭redis连接?

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

我的代码中有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: 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()
那么代码中可能还有一些你没有显示的东西。谢谢。我编辑它