客户端的超时时长分连接超时和读写超时,如果是基于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)。

如果设置Redis客户端的超时时长?的更多相关文章

  1. spring boot项目配置RestTemplate超时时长

    配置类: @Configuration public class FeignConfiguration { @Bean(name="remoteRestTemplate") pub ...

  2. 国人开源了一款超好用的 Redis 客户端,真香!!

    大家都知道,Redis Desktop Manager 是一款非常好用的 Redis 可视化客户端工具,但可惜的是 v0.9.4 版本之后需要收费了: 这个工具不再免费提供安装包了,要对所有安装包收费 ...

  3. 项目中redisTemplate设置的key,redis客户端上查询不到的问题

    再项目使用了redis储存key,测试需要在客户端删除对应的key,发现查询不到对应的key redis客户端: 发现redisTemplate实际存进去的key会多了几个字符 原因:程序中对key没 ...

  4. 常用的Redis客户端的并发模型(转)

      伪代码模型 # get lock : timestamp = current Unix time + lock = SETNX lock.foo timestamp or (now() > ...

  5. "Redis客户端连接数一直降不下来"的有关问题解决 good

    [线上问题] "Redis客户端连接数一直降不下来"的问题解决 前段时间,上线了新的 Redis缓存(Cache)服务,准备替换掉 Memcached. 为什么要将 Memcach ...

  6. Redis客户端管理

    1.客户端管理 Redis提供了客户端相关API对其状态进行监控和管理,本节将深入介绍各个API的使用方法以及在开发运维中可能遇到的问题. 1.1 客户端API 1.client list clien ...

  7. "Redis客户端连接数一直降不下来"的有关问题解决

    [线上问题] "Redis客户端连接数一直降不下来"的问题解决 前段时间,上线了新的 Redis缓存(Cache)服务,准备替换掉 Memcached. 为什么要将 Memcach ...

  8. spring整合redis客户端及缓存接口设计(转)

    一.写在前面 缓存作为系统性能优化的一大杀手锏,几乎在每个系统或多或少的用到缓存.有的使用本地内存作为缓存,有的使用本地硬盘作为缓存,有的使用缓存服务器.但是无论使用哪种缓存,接口中的方法都是差不多. ...

  9. 全球领先的redis客户端:SFedis

    零.背景 这个客户端起源于我们一个系统的生产问题. 一.问题的发生 在我们的生产环境上发生了两次redis服务端连接数达到上限(我们配置的单节点连接数上限为8000)导致无法创建连接的情况.由于这个系 ...

随机推荐

  1. java学习:循环结构的使用规则和注意事项

    循环结构的基本组成部分,一般可分为四部分: 初始化语句:在循环开始最初执行,而且只做唯一一次 条件判断:如果成立,则循环继续:如果不成立,则循环退出. 循环体:重复要做的事情内容,若干行语句. 进步语 ...

  2. pandas 学习 第十一篇:处理缺失值

    Pandas中的缺失值是指nan.None和NaT.如果需要把inf 和 -inf视为缺失值,需要设置 pandas的选项: pandas.options.mode.use_inf_as_na = T ...

  3. 使用DbVisualizer 10.0.20 查询ES中的索引时需要注意的事项

    查询前5条数据 光标停在某一个查询结果框中,左下角会显示该字段的类型 查询类型是text的字段使用单引号,使用双引号查询会报错

  4. .NET / C# 时间与时间戳的转换

    时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数. 我们在计算时间戳时应为1970年01月01日到指定时间. 应当注 ...

  5. VS开发C++控制台应用程序(示例)

    注:笔者使用的VS版本为2019.1.打开VS2019,选择文件 -> 新建 -> 项目 2.选择项目新建项目时选择C++“控制台应用”语言:C++平台:Windows项目类型:控制台 3 ...

  6. 解决TensorFlow在terminal中正常但在jupyter notebook中报错的方案

    报错情况: # 本地运行正常,jupyter中无法 import tensorflow ImportError: libcublas.so.10.0: cannot open shared objec ...

  7. 手写Ajax的意义所在,从青铜到钻石!

    话说菩提祖师打了孙猴子三板子  然后悟空学会72般变化以及一身神通 对待这个问题作为面试者要思考更加深层次的意义 才更能获得认可 实际上写的ajax 很能看出一个的水平 贴几段代码就可以看出水平的高低 ...

  8. angularJS中select元素的应用浅析

    select array 数据: select ng-model 用法: 1.可以是一个对象形式,ng-model="test" $scope.test = {name: &quo ...

  9. React Children 使用

    React 有一个特殊的属性children, 主要用于组件需要渲染内容,但它并不知道具体要渲染什么内容,怎么会有这种使用场景?确实比较少,但并不是没有,比如弹出框.当你写一个弹出框组件的时候,你知道 ...

  10. APS系统如何让企业实现“多赢”?看高博通信是怎么做的

    高博通信(上海)有限公司凭籍在超精密产业中的技术积累, 强大的资金优势以及与一流大学的联合,使得其正成为国内超精密电子制造行业的领导者. 雄厚的技术实力和专业的团队赢得了波音,空客公司等国际航空器制造 ...