分享
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。
GO中调用redis时,实始化一个连接池,做法也是一般的用户:
```go
&redis.Pool{
MaxIdle: beego.AppConfig.DefaultInt("redis::maxidle", 1),
MaxActive: beego.AppConfig.DefaultInt("redis::maxactive", 10),
IdleTimeout: time.Duration(beego.AppConfig.DefaultInt64("redis::idle_time_out", 180)) * time.Second,
Dial: func() (redis.Conn, error) {
log.Println("func dial REDIS_HOST:" + REDIS_HOST)
c, err := redis.Dial("tcp", REDIS_HOST)
if err != nil {
log.Println("dial error:", err)
return nil, err
}
// 选择db
c.Do("SELECT", REDIS_DB)
return c, nil
},
}
```
类似于以上,MaxActive曾调为100,或几K,大小,当一秒请求数据量,达到5000次以上时,每一次都调用:
```go
func GetValue(UID int) (value map[string]string, err error) {
// 获取连接
rs := RedisClient.Get()
defer rs.Close()
value, err = redis.StringMap(rs.Do("HGETALL", "xxxxx:"+strconv.Itoa(UID)))
if err != nil {
log.Println(err)
}
return value, err
}
```
这样的一个接口时,会导致CPU达到100%以上,同时出现redigo: connection pool exhausted这样的错误,发现是不断地调用Dial: func() (redis.Conn, error),他不是有连接池吧为什么要不断地调用DIAL?,一般这样大量数据请求时,做法如何?
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信11056 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传