如果你不传入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设置超时时间》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- [golang]一定要设置超时
- 深入理解数据库编程中的超时设置
- 惊呆了,RPC超时设置竟然引发了线上事故!
- Kooder 1.0 Alpha2 发布,支持 Gitlab 连接超时设置
- 6、web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求
- 深入理解 JDBC 的超时
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。