跨路由共享 Redis 设置

tom*_*456 2 go

我的文件中有许多路由routes.go,它们都调用我的 redis 数据库。我想知道如何避免在每条路线上拨打dialAUTH拨打电话。

我尝试在函数外部设置变量,如下所示:

var (
  c, err = redis.Dial("tcp", ADDRESS)
  _, err = c.Do("AUTH", "testing")
)
Run Code Online (Sandbox Code Playgroud)

但编译器不喜欢err被使用两次。

Jim*_*imB 5

首先,仅使用 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)