redigo设置超时时间

栏目: 数据库 · 发布时间: 7年前

如果你不传入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设置超时时间》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据密集型应用系统设计

数据密集型应用系统设计

Martin Kleppmann / 赵军平、李三平、吕云松、耿煜 / 中国电力出版社 / 2018-9-1 / 128

全书分为三大部分: 第一部分,主要讨论有关增强数据密集型应用系统所需的若干基本原则。首先开篇第1章即瞄准目标:可靠性、可扩展性与可维护性,如何认识这些问题以及如何达成目标。第2章我们比较了多种不同的数据模型和查询语言,讨论各自的适用场景。接下来第3章主要针对存储引擎,即数据库是如何安排磁盘结构从而提高检索效率。第4章转向数据编码(序列化)方面,包括常见模式的演化历程。 第二部分,我们将......一起来看看 《数据密集型应用系统设计》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具