客户端的超时时长分连接超时和读写超时,如果是基于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. Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

    Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理. JDK动态代理 JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只 ...

  2. 在 Docker 中运行 SpringBoot 应用

    创建 SpringBoot 项目 用 Idea 创建一个 SpringBoot 项目,编写一个接口: package cloud.dockerdemo import org.springframewo ...

  3. 使用HttpWebRequest和HttpWebResponse时接收数据中文乱码的情况

    今天在调试一个get请求的接口的时候发现HttpWebResponse方法接收数据的时候,中文出现乱码的情况. 原因是格式编码转码的问题. 原来自从Windows 2000之后的操作系统在文件处理时默 ...

  4. java基础 抽象

    /** * 抽象方法:就是加上abstract关键字,并去掉大括号,分号结束 * 抽象类:抽象方法坐在的类,必须是抽象类.在class前家abstract即可 * * 如何使用抽象类和抽象方法: * ...

  5. postman发送数据,django 获取接收数据

    postman发起请求如下图 在django中使用如下方式获取token print(request.META) token = request.META.get('HTTP_X_TOKEN')

  6. 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

    目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...

  7. FullCalendar日历插件说明文档(看到这篇手册,解决了困扰我3天的js问题)

    FullCalendar提供了丰富的属性设置和方法调用,开发者可以根据FullCalendar提供的API快速完成一个日历日程的开发,本文将FullCalendar的常用属性和方法.回调函数等整理成中 ...

  8. Js中级复习

    JS中级复习—— 1,this   就是js的关键字 用途:指向某一个对象 如何判断this指向: 函数(方法)内—— 一种以函数的方式调用(不带.)this指向window 一种以方法的形式调用(函 ...

  9. Vue3.0报错error: Unexpected console statement (no-console) 解决办法

    写项目过程中用ESLint遵守代码规范很有必要,但是对于一些规范也很是无语,比如:‘Unexpected console statement (no-console)’,连console都不能用,这就 ...

  10. ECharts堆叠柱状图label显示总和

    Echarts本身没提供现成的解决方案. option = { title: { text: '分类销量' }, legend: { y: "bottom", data: ['百货 ...