Search code examples
goredisredigo

Golang Increment data to Redis


I have been playing around with golang and redis. I just stood up a simple http server and wanted to increment requests on redis. I am blowing up the connections (I think). I found that with redigo you can use connection pooling, but not sure how to implment that in go when I am serving the requests (where do you instantiate / call the pool from).

error: can't assign requested address.

Any suggestions would be appreciated....I am sure I am incorrectly making the connections, but just not sure how to change.

EDIT: Modified per pauljz's suggestions -- Works great now

    var pool redis.Pool

    func qryJson(rw http.ResponseWriter, req *http.Request){

        incrementRedis()
    }

    func incrementRedis () {

    t := time.Now().Format("2006-01-02 15:04:05")
    conn := pool.Get()
    defer conn.Close()
    if _, err := conn.Do("HINCRBY", "messages", t, 1); err != nil {
        log.Fatal(err)

    }


    }

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    pool = redis.Pool{
            MaxIdle: 50,
            MaxActive: 500, // max number of connections
            Dial: func() (redis.Conn, error) {
                    c, err := redis.Dial("tcp", ":6379")
                    if err != nil {
                            panic(err.Error())
                    }
                    return c, err
            },
    } 
    http.HandleFunc("/testqry", qryJson)
    log.Fatal(http.ListenAndServe(":8082", nil))
}

Solution

  • The redigo docs have a good starter example for connection pooling: http://godoc.org/github.com/garyburd/redigo/redis#Pool

    In your case you would have a var pool redis.Pool in your package (i.e. not inside of a function).

    In main(), before your ListenAndServe call, you would call pool = redis.Pool{ ... } from the redigo example to initialize the pool.

    In incrementRedis() you would then do something like:

    func incrementRedis () {
        conn := pool.Get()
        defer conn.Close()
        if _, err := conn.Do("HINCRBY", "messages", t, 1); err != nil {
            log.Fatal(err)
        }
    }