连接到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),将 tried 放在主函数中,这让我感到失望的是,它也没有工作。
这是一个更大的关注,因为我有许多其他功能,必须与Redis沟通,但重新建立与Redis的连接,每次似乎是愚蠢的。
Redigo只是展示了如何创建一个拨号实例,但并没有进一步解释如何重用它。
你可能在我的演讲中迷失了方向,但我想在这里加入一些背景,所以我明确而简洁的问题是:你如何重复使用(而不是每次都重新创建)一个Redigo连接?
发布于 2014-06-24 13:57:16
最好的方法是使用池,这里简要地记录了这些池:Redigo池。
全局变量最终不会重用连接,因此我最终得到了类似的结果(如前面提到的那样使用池):
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)
}发布于 2016-05-27 02:11:29
redis.Dial()方法返回客户端错误。要修复它,您应该替换:
var Client = redis.Dial("tcp", ":6379") 通过以下方式:
var Client, _ = redis.Dial("tcp", ":6379")https://stackoverflow.com/questions/24387350
复制相似问题