7

连接到 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

我尝试将连接设置为const (ant),将defer放在 main 函数中,令我沮丧的是也无法正常工作。

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

Redigo API 仅展示了如何创建Dial实例,但没有进一步解释如何重用它。

您可能在我的演讲中迷失了方向,但我想在这里提供一些背景信息,所以我的清晰简洁的问题是:您如何重新使用(而不是每次都重新创建)Redigo 连接?

4

2 回答 2

21

最好的方法是使用 Pools,这里简要记录:Redigo Pools

全局变量最终不会重用连接,所以我最终得到了这样的东西(使用前面提到的池):

func newPool() *redis.Pool {
return &redis.Pool{
            MaxIdle: 80,
            MaxActive: 12000, // max number of connections
            Dial: func() (redis.Conn, error) {
                    c, err := redis.Dial("tcp", ":6379")
                    if err != nil {
                            panic(err.Error())
                    }
                    return c, err
            },
    } 

}

var pool = newPool()

func main() {

        c := pool.Get()
        defer c.Close()

        test,_:=c.Do("HGETALL", "test:1")
        fmt.Println(test)
}

例如,如果你想在另一个函数中重用一个池,你可以这样做:

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

        test2,_:=c.Do("HGETALL", "test:2")
        fmt.Println(test2)
}
于 2014-06-24T13:57:16.580 回答
-1

redis.Dial()方法返回客户端错误。要修复它,您应该替换:

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

和:

var Client, _ = redis.Dial("tcp", ":6379")
于 2016-05-27T02:11:29.107 回答