gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:22:25 25 4
gpt4 key购买 nike

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

最佳答案

事实证明最好的方法是使用池,这里简要记录了池: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)
}

关于go - 重新使用 Redigo 连接而不是每次都重新创建它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24387350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com