专栏首页蓝天如果设置Redis客户端的超时时长?

如果设置Redis客户端的超时时长?

客户端的超时时长分连接超时和读写超时,如果是基于hiredis的实现,则读写超时是合在一起的,同一参数控制。

在hiredis中,读写超时调用函数redisSetTimeout设置,可以看到没有区分读和写:

int redisSetTimeout(redisContext *c, const struct timeval tv);

而连接超时,则是在建立连接时指定:

redisContext *redisConnectWithTimeout(const char *ip, int port, const struct timeval tv);

超时值设置偏小,容易导致访问redis失败。如果是写操作(set、lpush、hset、incrby等操作),则结果还有不确定性,即可能在redis端成功了,但客户端得到的是超时,象incrby和setnx等操作还不方便简单重试。

如果超时值设置过大,则在redis异常时不容易及时做切换,比如master卡住(可能因为在重写AOF而繁忙)时,调用者也将被卡住,不能及时解脱,一些情况下可能造成雪崩,这种情况下超时值越小越有利。

如何确定一个合理超时值了?原则是保证大多数超时都能成功,因此需要确定什么值可以满足大多数情况。这需考虑两个方面:

1) 网络延迟,通过ping掌握网络延迟

$ ping -c 3 192.168.1.22 PING 192.168.1.22 (192.168.1.22) 56(84) bytes of data. 64 bytes from 192.168.1.22: icmp_seq=1 ttl=53 time=31.7 ms 64 bytes from 192.168.1.22: icmp_seq=2 ttl=53 time=31.7 ms 64 bytes from 192.168.1.22: icmp_seq=3 ttl=53 time=31.7 ms   --- 192.168.1.22 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2000ms rtt min/avg/max/mdev = 31.720/31.725/31.728/0.145 ms

2) 查看redis慢日志

$ redis-cli slowlog get  1) 1) (integer) 10526     2) (integer) 1566357322     3) (integer) 10926     4) 1) "ZCOUNT"        2) "test1"        3) "-9223372036854775808"        4) "9223372036854775807"  2) 1) (integer) 10525     2) (integer) 1566343237     3) (integer) 17572     4) 1) "HGET"        2) "test2"        3) "tq"  3) 1) (integer) 10524     2) (integer) 1566343212     3) (integer) 101400     4) 1) "HGET"        2) "test3"        3) "tq"

看“slowlog get”命令输出的第“3”条数值,比如上面的“10926”、“17572”和“101400”,分别表示对应命令执行的时长,单位为微秒。显然以上述为例,超时时长不能小于“102+32”毫秒,即读写超时至少得设置134毫秒。

显然实际中,超值时不可能很小,如果都是同步调用,调用相互耦合,一个redis节点异常即会影响全局,为此业务侧的架构应考虑到这一点。原则是一次业务操作只涉及单个redis节点,业务侧采用分机器、分进程或分线程方式解耦,这样即使某redis节点异常,也只会影响这部分数据,其它部分仍然可正常操作(这里建议redis的配置项cluster-require-full-coverage值为no)。

window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用Linux自带日志滚动工具logrotate滚动redis日志示例

    截至到redis-5.0版本,redis仍然不会自动滚动日志文件,如果不处理则日志文件日积月累越来越大,最终将导致磁盘满告警:

    一见
  • Linux批量远程命令和上传下载工具

    https://github.com/eyjian/mooon/releases/tag/mooon-tools mooon_ssh:批量远程命令工具,...

    一见
  • Redis-3.2.9集群配置(redis cluster)

    本文参考官方文档而成:http://redis.io/topics/cluster-tutorial。经测试,安装过程也适用于redis-3.2.0。

    一见
  • golang中对map操作类

    package beeku import ( "sort" ) type MapSorter struct { Ke...

    李海彬
  • ping, tracert, traceroute, netstat命令详解

    ping可以测试计算机名和计算机的 ip 地址,验证与远程计算机的连接,通过将 icmp 回显数据包发送到计算机并侦听回显回复数据包来验证与一台或多台远程计算机...

    阳光岛主
  • 1-3、ping 和tracert 命令

    Pinging 192.168.0.1 with 32 bytes of data: Reply from 192.168.0.1: bytes=32 time...

    py3study
  • linux 服务器带宽测试脚本ZBench

    很郁闷,今天我的vultr服务器的ip被ban了,无奈只能换服务器,今天给大家推荐一个vps的带宽测速脚本ZBench可以一键测试你的服务器到国内和国外的速度

    bboysoul
  • redis性能测试

    @坤的
  • Confluence 6 属性的一个示例 原

     注意,每一个缩进的行表示的是上一个调用下面的子调用。上面的示例中,Confluence Overview 页面调用完成耗费了 344ms。在这个 344ms ...

    HoneyMoose
  • Confluence 6 属性的一个示例 原

     注意,每一个缩进的行表示的是上一个调用下面的子调用。上面的示例中,Confluence Overview 页面调用完成耗费了 344ms。在这个 344ms ...

    HoneyMoose

扫码关注云+社区

领取腾讯云代金券