我的文件中有许多路由routes.go,它们都调用我的 redis 数据库。我想知道如何避免在每条路线上拨打dial和AUTH拨打电话。
我尝试在函数外部设置变量,如下所示:
var (
c, err = redis.Dial("tcp", ADDRESS)
_, err = c.Do("AUTH", "testing")
)
Run Code Online (Sandbox Code Playgroud)
但编译器不喜欢err被使用两次。
首先,仅使用 var 来声明变量。您无法在函数之外运行代码,因此尝试在 var 语句内创建连接是没有用的。init()如果您需要在启动时运行某些内容,请使用。
Redis 连接不能用于并发请求。如果你想跨多个路由共享一个redis连接,你需要有一个安全的方法来并发使用。如果github.com/garyburd/redigo/redis您想使用Pool. 您可以AUTH在 Dial 函数内进行调用,每次都返回一个就绪连接。
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
},
}
}
Run Code Online (Sandbox Code Playgroud)
然后,每次需要连接时,您都会从池中获取一个连接,并在完成后将其返回。
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
}
Run Code Online (Sandbox Code Playgroud)