http - 池连接每次都连接?

标签 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)
}

最佳答案

您一次只允许池中有 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) },
}

关于http - 池连接每次都连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50760944/

相关文章:

php - 浏览器可以使用 POST 重定向到 url 吗?

javascript - SailsJS : POST requests are not resolved properly when invoking req. param() 和 req.file()

base64 - 编码/解码base64

Docker 容器中的 Redis 和服务

node.js - 如何理解utf8编码文本中的文本语言?

ios - 火力地堡 : Access the database from URL

macos - Paw 如何从 csv 或 json 文件中读取动态值?

go - 如何将结构 slice 转换为字符串 slice ?

sql - 获取指向结构字段值的指针

windows - 为什么 Windows 系统不适合(生产模式)Key/Value DB