美文网首页
redigo设置超时时间

redigo设置超时时间

作者: mingzhi618 | 来源:发表于2018-10-19 17:18 被阅读0次

如果你不传入timeout的值,那么默认0值的话,这两个set deadline的逻辑就跳过了。。。

如果不设置read/write timeout 会导致什么问题呢?假如网络有波动,执行一个redis 命令的时候,一直没收到服务器的响应,会导致这次请求一直没有返回,晾在那。直到redis服务器设置的超时时间到了,关闭连接,然后就会读到一个EOF的错误。

单点redis的情况,如果不设置MaxActive,redis

pool的连接数是没有上限的,问题就不会暴露出来,这对我们的服务来说,影响也不大,就是在错误日志中,会多几条redis相关的EOF日志,但是这样真的没问题么?当然有问题,如果是从redis读消息,没有设置read

timeout,一直读不到,这个协程就卡在那,迟迟不给响应,对用户来说很不好。

使用集群模式,一般redis_proxy 会限制连接数,所以redis pool 就应该用MaxActive限制池子里的最大连接数,这时候如果不设置read/write timeout,问题就来了,池子里的连接会越来越少直到没有。

因此,不管那种情况,我们都应该给redis.Dial这个方法,传入三个超时时间,DialConnectTimeout, DialReadTimeout,DialWriteTimeout。

附上现在在用的 redigo的redis pool。

redis.Pool{ MaxIdle: cf.StatsRedis.MaxIdle, MaxActive: cf.StatsRedis.MaxActive, Dial: func() (redis.Conn, error) { c, err := redis.Dial("tcp", cf.StatsRedis.ProxyAddress, redis.DialConnectTimeout(time.Duration(cf.StatsRedis.ConnectTimeout) * time.Millisecond), redis.DialReadTimeout(time.Duration(cf.StatsRedis.ReadTimeout) * time.Millisecond), redis.DialWriteTimeout(time.Duration(cf.StatsRedis.WriteTimeout) * time.Millisecond)) if err != nil { l4g.Error(err) return nil, err } return c, nil }, // Use the TestOnBorrow function to check the health of an idle connection // before the connection is returned to the application. TestOnBorrow: func(c redis.Conn, t time.Time) error { if time.Since(t) < time.Minute { return nil } _, err := c.Do("PING") return err }, IdleTimeout: 300 * time.Second, // If Wait is true and the pool is at the MaxActive limit, // then Get() waits for a connection to be returned to the pool before returning Wait: true, },

之前一直以为redis.Dial这个方法会有默认的超时时间,结果事实证明它没有啊。。

写代码一定不能用“以为”。

选自: http://www.yourmoonlight.com/golang/2017/01/15/%E5%88%86%E4%BA%AB%E4%BD%BF%E7%94%A8redigo%E8%BF%9E%E5%88%B0redis-proxy%E8%B8%A9%E5%88%B0%E7%9A%84%E5%9D%91

相关文章

网友评论

      本文标题:redigo设置超时时间

      本文链接:https://www.haomeiwen.com/subject/vjluzftx.html