我想在go中编写一个简单的http服务器,接受一个查询字符串并将其推送到redis.我使用redigo模块进行redis连接,使用fasthttp进行http服务器.
在代码中(下面).我正在尝试使用redis池,以便重用连接.当我尝试使用ab进行基准测试时
ab -n 10000 -c 100 -k -r http://127.0.0.1:9080/?a=b
Run Code Online (Sandbox Code Playgroud)
我看到将近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)
}
Run Code Online (Sandbox Code Playgroud)
您一次只允许池中有3个空闲连接,因此在完成第一个100个客户端的并发批处理后,最多可以关闭97个连接而不是重新使用.
您需要将MaxIdle值设置为可以处理预期并发的值,在这种情况下为100.如果要对打开的连接设置限制,则还应设置MaxActive并使Wait活动中的峰值不会耗尽服务器资源.
return &redis.Pool{
MaxIdle: 100,
IdleTimeout: 240 * time.Second,
MaxActive: 200,
Wait: true,
Dial: func() (redis.Conn, error) { return redis.Dial("tcp", addr) },
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |