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

时间:2014-06-24 13:01:48

标签: 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")
}

但把它带到外面并不是:

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),将延迟置于主要功能中让我感到沮丧不行。

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

Redigo API仅显示了如何创建拨号实例,但没有通过解释如何重复使用它来进一步说明。

你可能已经在我的谈话中迷失了,但我想在这里提出一些背景,所以我的简明扼要的问题是:你如何重新使用(不是每次都重新创建) Redigo连接?

2 个答案:

答案 0 :(得分:15)

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

全局变量最终不会重用连接,所以我最终得到了这样的东西(如前所述使用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)
}

答案 1 :(得分:0)

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

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

with:

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