我的routes.go
文件中有许多路由,它们都调用我的redis数据库。我想知道如何避免在每条路线中拨打dial
和AUTH
来电。
我尝试在这些函数之外设置变量:
var (
c, err = redis.Dial("tcp", ADDRESS)
_, err = c.Do("AUTH", "testing")
)
但是编译器不喜欢err
被使用两次。
答案 0 :(得分:4)
首先,仅使用var来声明变量。您无法在函数之外运行代码,因此尝试在var语句中创建连接没有用处。如果您需要在启动时运行某些内容,请使用init()
。
redis连接不能与并发请求一起使用。如果要跨多个路由共享redis连接,则需要有一个安全的并发方法。对于github.com/garyburd/redigo/redis
,您要使用Pool
。您可以在拨号功能内进行AUTH
调用,每次都返回就绪连接。
var redisPool *redis.Pool
func init() {
redisPool = &redis.Pool{
MaxIdle: 3,
IdleTimeout: 240 * time.Second,
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", server)
if err != nil {
return nil, err
}
if _, err := c.Do("AUTH", password); err != nil {
c.Close()
return nil, err
}
return c, err
},
}
}
然后,每当您需要连接时,您将从池中获取一个连接,并在完成后将其返回。
conn := redisPool.Get()
// conn.Close() just returns the connection to the pool
defer conn.Close()
if err := conn.Err(); err != nil {
// conn.Err() will have connection or Dial related errors
return nil, err
}