池连接每次都连接?

时间:2018-06-08 12:43:58

标签: http go redis

我正在尝试在go中编写一个简单的http服务器,接受一个查询字符串并将其推送到redis。我使用redigo模块进行redis连接,使用fasthttp进行http服务。

在代码中(下方)。我正在尝试使用redis池,以便重用连接。当我尝试使用ab

进行基准测试时
ab -n 10000 -c 100 -k -r http://127.0.0.1:9080/?a=b

我看到将近6000个redis连接被打开。 我可以看到使用netstat

连接池是否无法正常工作?如何减少与redis的连接?

package main

import (
    "fmt"
    "time"
    "github.com/garyburd/redigo/redis"
    "github.com/valyala/fasthttp"
)

var Pool *redis.Pool
var err error

func init() {
    Pool = newPool("127.0.0.1:6379")
    _, err = Pool.Dial()
    if err != nil {
        fmt.Println(err)
    }
}

func newPool(server string) *redis.Pool {

    return &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
            }
            return c, err
        },
    }
}

func fastHTTPHandler(ctx *fasthttp.RequestCtx) {
    conn := Pool.Get()
    defer conn.Close()
    conn.Do("RPUSH", "LTBENCH_PARAMS", ctx.QueryArgs().QueryString())

}

func main() {
    fasthttp.ListenAndServe(":9080", fastHTTPHandler)
}

1 个答案:

答案 0 :(得分:5)

您一次只允许池中有3个空闲连接,因此在完成第一个100个客户端的并发批处理后,最多可以关闭97个连接而不是重新使用。

您需要将MaxIdle设置为可以处理预期并发的值,在这种情况下为100。如果要对打开的连接设置限制,还应设置MaxActiveWait,以便活动中的峰值不会耗尽服务器资源。

return &redis.Pool{
    MaxIdle:     100,
    IdleTimeout: 240 * time.Second,
    MaxActive:   200,
    Wait:        true,
    Dial:        func() (redis.Conn, error) { return redis.Dial("tcp", addr) },
}