前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【提问帖】GO中调用redis时,当并发量比较大时出现的问题。

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

作者头像
李海彬
发布2018-03-27 11:25:19
2.2K0
发布2018-03-27 11:25:19
举报
文章被收录于专栏:Golang语言社区
GO中调用redis时,实始化一个连接池,做法也是一般的用户:
代码语言:javascript
复制
&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 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis®
腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档