直接代码了
package utils
import (
"github.com/garyburd/redigo/redis"
"time"
)
var redispool map[string]*redis.Pool
type RedisConn struct {
Con redis.Conn
}
func NewRedisConn(tag string) *RedisConn {
return &RedisConn{redispool[tag].Get()}
}
func (r *RedisConn) Dos(cmd string, args ...interface{}) (result interface{}, err error) {
result, err = r.Con.Do(cmd, args...)
if err != nil {
Log.Error(err)
}
return
}
func (r *RedisConn) Sends(cmd string, args ...interface{}) error {
err := r.Con.Send(cmd, args...)
if err != nil {
Log.Error(err)
}
return err
}
func (r *RedisConn) Close() {
r.Con.Close()
}
/*
生成redis连接池
*/
func newRedisPool(server string, maxidle int) *redis.Pool {
return &redis.Pool{
MaxIdle: maxidle,
MaxActive: 200,
IdleTimeout: 240 * time.Second,
Wait: true,
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", server)
if err != nil {
return nil, err
}
return c, err
},
TestOnBorrow: func(c redis.Conn, t time.Time) error {
_, err := c.Do("PING")
return err
},
}
}
maxidle设置的是10
func (t *ALL) Exec(body []byte) {
request := t.TransReq(body)
redisconn := utils.NewRedisConn("apis")
defer redisconn.Close()
keys := utils.GetKey(*request, t.Config.Key)
key := keys.Key
snow.Rotate(&snow.SnowSys{Key: key, Index: keys.Index, Tag: "apis", Trem: "all", RedisConn: redisconn}, t.Config.Snow)
redisconn.Dos("MULTI")
defer redisconn.Dos("EXEC")
if request.CODE == "0" {
redisconn.Sends("HINCRBYFLOAT", key, "succ", 1.000000)
redisconn.Sends("HINCRBYFLOAT", key, "total", 1.000000)
}
if request.CODE != "0" {
redisconn.Sends("HINCRBYFLOAT", key, request.CODE, 1.000000)
redisconn.Sends("HINCRBYFLOAT", key, "fail", 1.000000)
redisconn.Sends("HINCRBYFLOAT", key, "total", 1.000000)
}
}
这里是请求调用,用的时批处理
现在发现每秒10k请求,持续1分钟后,客户端就会出现上万的TIME_WAIT的链接,然后程序就报: connect: cannot assign requested address了,redis服务器上基本没链接。
打印出来的redis.pool.activecount 活跃的数量一直每超过200
是我使用redis 连接池的方法不对么?