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

时间:2022-05-06
本文章向大家介绍【提问帖】GO中调用redis时,当并发量比较大时出现的问题。,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
GO中调用redis时,实始化一个连接池,做法也是一般的用户:
&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?,一般这样大量数据请求时,做法如何?