连接到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连接?
答案 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")