重新使用Redigo连接,而不是每次都重新创建连接

重新使用Redigo连接,而不是每次都重新创建连接,go,reusability,redigo,Go,Reusability,Redigo,连接到Redigo并在函数中操作数据就像黄油一样简单,但问题是当您必须重新使用其连接时,显然是出于性能/实用性的原因 在这样的函数中执行此操作: func main() { client, err := redis.Dial("tcp", ":6379") if err != nil { panic(err) } defer client.Close() client.Do("GET", "test:1") } 但把它带到外面不会:

连接到Redigo并在函数中操作数据就像黄油一样简单,但问题是当您必须重新使用其连接时,显然是出于性能/实用性的原因

在这样的函数中执行此操作:

func main() {

    client, err := redis.Dial("tcp", ":6379")
    if err != nil {
        panic(err)
    }
    defer client.Close()

    client.Do("GET", "test:1")
}
但把它带到外面不会:

var Client = redis.Dial("tcp", ":6379")
defer Client.Close()

func main() {

        Client.Do("GET", "test:1")
    }
返回以下错误:

./main.go:1: multiple-value redis.Dial() in single-value context
./main.go:2: non-declaration statement outside function body
我已经尝试将连接作为一个常量(ant),将延迟放在主函数中,但令我失望的是,它没有工作

这是一个更大的问题,因为我有许多其他功能必须与Redis通信,但每次重新创建与Redis的连接似乎都很愚蠢

Redigo API只展示了如何创建拨号实例,但没有进一步解释如何重用它


你可能在我的演讲中迷失了方向,但我想在这里介绍一下上下文,所以我的问题是:如何重新使用(而不是每次重新创建)Redigo连接?

最好的方法是使用池,这里简要介绍了池:

全局变量最终不会重用连接,因此我最终得到了类似的结果(如前所述使用池):

例如,如果要在另一个函数中重用池,请按如下方式执行:

func test() {
        c := pool.Get()
        defer c.Close()

        test2,_:=c.Do("HGETALL", "test:2")
        fmt.Println(test2)
}
redis.Dial()
方法返回客户端错误。要修复此问题,您应该替换:

var Client = redis.Dial("tcp", ":6379") 
与:

var Client, _ = redis.Dial("tcp", ":6379")

为什么不使用redigo池?为什么拨号功能正在调用panic?是否应该由用户决定如何处理错误?@user658991是正确的。拨号功能不应死机。使用
Dial:func()(redis.Conn,error){return redis.Dial(“tcp”,“:6379”)}
No,您不应该这样做,而是应该处理错误,而不是忽略它。
var Client, _ = redis.Dial("tcp", ":6379")