我一直在玩golang和redis。我只是站起来一个简单的http服务器,想在redis上增加请求。我正在炸毁这些联系(我想)。我发现使用redigo你可以使用连接池,但不知道如何在我提供请求时(在哪里实例化/从中调用池)实现。
错误:无法分配请求的地址。
任何建议都会受到赞赏....我确信我错误地建立了连接,但不确定如何更改。
编辑:根据pauljz的建议进行修改 - 现在效果很好
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))
}
答案 0 :(得分:4)
redigo文档有一个很好的连接池初学者示例:http://godoc.org/github.com/garyburd/redigo/redis#Pool
在你的情况下,你的包中会有var pool redis.Pool
(即不在函数内)。
在main()
,ListenAndServe
来电之前,您可以从redigo示例中调用pool = redis.Pool{ ... }
来初始化游戏池。
在incrementRedis()
中,您可以执行以下操作:
func incrementRedis () {
conn := pool.Get()
defer conn.Close()
if _, err := conn.Do("HINCRBY", "messages", t, 1); err != nil {
log.Fatal(err)
}
}
答案 1 :(得分:3)
在您的代码中,您为每个http请求创建与redis的连接。使用全局变量来存储连接的redis连接并重用它。