跨路线共享Redis设置

I have a number of routes in my routes.go file and they all call my redis database. I'm wondering how I can avoid calling the dial and AUTH calls in every route.

I've tried setting variables outside the functions like this:

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

but then the compiler doesn't like err being used twice.

First, only use var for declaring variables. You can't run code outside of functions, so there's no use in trying to create connections inside a var statement. Use init() if you need something run at startup.

The redis connections can't be used with concurrent requests. If you want to share a redis connection across multiple routes, you need to have a safe method for concurrent use. In the case of github.com/garyburd/redigo/redis you want to use a Pool. You can do the AUTH call inside the Dial function, returning a ready connection each time.

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
        },
    }
}

Then each time you need a connection, you get one from the pool, and return it when you're done.

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
}

What I would do is instantiate a connection pool in main.go and pass the reference to the pool to your routes. This way you are setting up your redis client once, and your routes can leverage it.

I created a decorator around redigo that makes creating a Redis Client with a Connection pool very straightforward. Plus it is type-safe. You can check it out here: https://github.com/shomali11/xredis