GO中调用redis时,当并发量比较大时出现的问题。

yuyifeichina · · 1507 次点击 · 开始浏览   
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?,一般这样大量数据请求时,做法如何?
1507 次点击  
加入收藏 微博
8 回复  |  直到 2017-08-10 17:14:40
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet