首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【提问帖】GO中调用redis时,当并发量比较大时出现的问题。

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

作者头像
李海彬
发布2018-03-27 11:25:19
发布2018-03-27 11:25:19
2.7K00
代码可运行
举报
文章被收录于专栏:Golang语言社区Golang语言社区
运行总次数:0
代码可运行
GO中调用redis时,实始化一个连接池,做法也是一般的用户:
代码语言:javascript
代码运行次数:0
运行
复制
&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次以上时,每一次都调用:
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?,一般这样大量数据请求时,做法如何?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档