跨路线共享Redis设置

时间:2015-05-14 17:54:54

标签: go

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

我尝试在这些函数之外设置变量:

var (
  c, err = redis.Dial("tcp", ADDRESS)
  _, err = c.Do("AUTH", "testing")
)

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

1 个答案:

答案 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
}