redigo连接池不入坑

2018-08-31  本文已影响0人  colors_liu

写在前面

用go开发web项目时,经常会用到redis,推荐使用redigo包,目前有4800多个star,基本不会有太大的坑。
https://github.com/gomodule/redigo

聊聊redis的i/o并发

Redis is single-threaded with epoll/kqueue and scales indefinitely in terms of I/O concurrency.

redis是单线程的,但又是处实现并发的呢?参照地址:
https://stackoverflow.com/questions/10489298/redis-is-single-threaded-then-how-does-it-do-concurrent-i-o
redis是使用事件循环来实现并发的,事件是原子性的,还没有额外的锁开销。设计非常精妙。

我们在读写redis时,大多都是网络传输层的开销,redis计算是非常快的。所以我们尽量用多个连接去读写redis,相当于并发做网络传递,排队等着redis计算,不能让redis计算引擎闲下来。

使用连接池

在使用redigo的时候,强烈建议使用连接池,不然每次都得tcp建链,不嫌麻烦吗。而使用连接池的话,只管去get其它都给交类库去处理。示例代码如下:

var redisClient *redis.Pool
func init() {
    maxIdle := MaxIdle
    if v, ok := conf["MaxIdle"]; ok {
        maxIdle = int(v.(int64))
    }   
    maxActive := MaxActive
    if v, ok := conf["MaxActive"]; ok {
        maxActive = int(v.(int64))
    }   

    // 建立连接池
    redisClient = &redis.Pool{
        MaxIdle:     maxIdle,
        MaxActive:   maxActive,
        IdleTimeout: MaxIdleTimeout * time.Second,
        Wait:        true,
        Dial: func() (redis.Conn, error) {
            con, err := redis.Dial("tcp", conf["Host"].(string),
                redis.DialPassword(conf["Password"].(string)),
                redis.DialDatabase(int(conf["Db"].(int64))),
                redis.DialConnectTimeout(timeout*time.Second),
                redis.DialReadTimeout(timeout*time.Second),
                redis.DialWriteTimeout(timeout*time.Second))
            if err != nil {
                return nil, err 
            }   
            return con, nil 
        },  
    }
}
// 从池里获取连接
rc := RedisClient.Get()
// 用完后将连接放回连接池
defer rc.Close()
// 错误判断
if conn.Err() != nil {
  //TODO
}

其它有几个需要注意的地方:

常见报错

连接池消耗殆尽

redigo: connection pool exhausted

redigo常常会有这样的报错。我们来从redigo源码上来分析这个问题。

    // Handle limit for p.Wait == false.
    if !p.Wait && p.MaxActive > 0 && p.active >= p.MaxActive {
        p.mu.Unlock()
        return nil, ErrPoolExhausted
    }  

当Wait==false,并且当前有效连接>=最大连接数里就报这个错了。要解决这个问题的话,可以修改这个参数:

上一篇下一篇

猜你喜欢

热点阅读