一、无法从连接池获取到连接

JedisPool中的Jedis对象个数是有限的,默认是8个。这里假设使用的默认配置,如果有8个Jedis对象被占用,并且没有归还,如果调用者还要从JedisPool中借用Jedis,就需要进行等待(例如设置了maxWaitMillis>0),如果在maxWaitMillis时间内仍然无法获取到Jedis对象就会抛出如下异常。

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool…
Caused by: java.util.NoSuchElementException: Timeout waiting for idle objectat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)

还有一种情况,就是设置了blockWhenExhausted=false,那么调用者发现池子中没有资源时,会立即抛出异常不进行等待,下面的异常就是blockWhenExhausted=false时的效果。

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool…
Caused by: java.util.NoSuchElementException: Pool exhaustedat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:464)

对于这个问题,需要重点讨论的是为什么连接池没有资源了,造成没有资源的可能的原因非常多

1.客户端:高并发下连接池设置过小,出现供不应求,所以会出现上面的错误,但是正常情况下只要比默认的最大连接数(8个)多一些即可,因为正常情况下JedisPool以及Jedis的处理效率足够高。

2.客户端:没有正确使用连接池,比如没有进行释放,例如下面代码所示:定义JedisPool,使用默认的连接池配置。

GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);
//向JedisPool借用8次连接,但是没有执行归还操作。
for (int i = 0; i < 8; i++) {Jedis jedis = null;try {jedis = jedisPool.getResource();jedis.ping();} catch (Exception e) {e.printStackTrace();}
}

当调用者再向连接池借用Jedis时(如下操作),就会抛出异常:

jedisPool.getResource().ping();

3.客户端:存在慢查询操作,这些慢查询持有的Jedis对象归还速度会比较慢,造成池子满了。

4.服务端:客户端是正常的,但是Redis服务端由于一些原因造成了客户端命令执行过程的阻塞,也会使得客户端抛出这种异常。可以看到造成这个异常的原因是多个方面的,不要被异常的表象所迷惑,而且并不存在万能钥匙能解决所有问题,开发和运维只能不断加强对于Redis的理解,顺藤摸瓜逐渐找到问题所在。

二、 客户端读写超时

Jedis在调用Redis时,如果出现了读写超时后,会出现下面的异常:

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out

造成该异常的原因也有以下几种:

  • 读写超时设置的过短。
  • 命令本身就比较慢。
  • 客户端与服务端网络不正常。
  • Redis自身发生阻塞。

三、客户端连接超时

Jedis在调用Redis时,如果出现了读写超时后,会出现下面的异常:

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out

造成该异常的原因也有以下几种:

  • 连接超时设置的过短。
  • Redis发生阻塞,造成tcp-backlog已满,造成新的连接失败。
  • 客户端与服务端网络不正常。

四、客户端缓冲区异常

Jedis在调用Redis时,如果出现客户端数据流异常,会出现下面的异常。

redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream.

造成这个异常原因可能有如下几种:

1.输出缓冲区满。例如将普通客户端的输出缓冲区设置为1M 1M 60:

config set client-output-buffer-limit "normal 1048576 1048576 60 slave 268435456 67108864 60 pubsub 33554432 8388608 60"

如果使用get命令获取一个bigkey(例如3M),就会出现这个异常。

2.长时间闲置连接被服务端主动断开,可以查询timeout配置的设置以及自身连接池配置是否需要做空闲检测。

3.不正常并发读写:Jedis对象同时被多个线程并发操作,可能会出现上述异常。

五、Lua脚本正在执行

如果Redis当前正在执行Lua脚本,并且超过了lua-time-limit,此时Jedis调用Redis时,会收到下面的异常。对于如何处理这类问题(Lua lua-time-limit配置之前章节已经介绍了)

redis.clients.jedis.exceptions.JedisDataException: BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.

六、Redis正在加载持久化文件

Jedis调用Redis时,如果Redis正在加载持久化文件,那么会收到下面的异常。

redis.clients.jedis.exceptions.JedisDataException: LOADING Redis is loading the dataset in memory

七、Redis使用的内存超过maxmemory配置

Jedis调用Redis执行写操作时,如果Redis的使用内存大于maxmemory的设置,会收到下面的异常,此时应该调整maxmemory并找到造成内存增长的原因(maxmemory之前章节已经介绍了)

redis.clients.jedis.exceptions.JedisDataException: OOM command not allowed when used memory > 'maxmemory'.

八、客户端连接数过大

如果客户端连接数超过了maxclients,新申请的连接就会出现如下异常:

redis.clients.jedis.exceptions.JedisDataException: ERR max number of clients reached

此时新的客户端连接执行任何命令,返回结果都是如下:

127.0.0.1:6379> get hello
(error) ERR max number of clients reached

这个问题可能会比较棘手,因为此时无法执行Redis命令,一般来说可以从两个方面进行着手。

1.客户端:如果maxclients参数不是很小的话,应用方的客户端连接数基本不会超过maxclients,通常来看是由于应用方对于Redis客户端使用不当造成的。此时如果应用方是分布式结构的话,可以通过下线部分应用节点(例如占用连接较多的节点),使得Redis的连接数先降下来。从而让绝大部分节点可以正常运行,此时在再通过查找程序bug或者调整maxclients进行问题的修复。

2.服务端:如果此时客户端无法处理,而当前Redis为高可用模式(例如Redis Sentinel和Redis Cluster),可以考虑将当前Redis做故障转移。

此问题不存在确定的解决方式,但是无论从哪个方面进行处理,故障的快速恢复极为重要,当然更为重要的是找到问题的所在,否则一段时间后客户端连接数依然会超过maxclients。

附赠GenericObjectPoolConfig的重要属性

参考链接 :

Redis常见客户端异常汇总 :https://mp.weixin.qq.com/s/TtgTYXpIxAlmfGHaTDVLlA

Redis常见客户端异常汇总相关推荐

  1. Redis常见面试问题汇总及解析

      面试后端开发的职位,相信大家经常被问到有关redis问题.Redis作为缓存系统的代表很有必要弄熟搞懂,无论是在工作当中还是求职面试过程中都是大有裨益的,本文将详细介绍一些redis的一些典型问题 ...

  2. ESB接口调用异常汇总

    文章目录 一.ESB接口前置知识 1. ESB接口简述 2. 生成的代码组成部分 二.常见的异常汇总 2.1. 场景1:不能解析某域名 2.2. 场景2:调用服务连接超时 三.调用服务前异常 3.1. ...

  3. Redis:redis通用命令;redis常见数据结构;redis客户端;redis的序列化

    一.redis命令 1.redis通用命令 Redis 通用命令是一些 Redis 下可以作用在常用数据结构上的常用命令和一些基础的命令 常见的命令有: keys 查看符合模板的所有key,不建议在生 ...

  4. 漂亮又好用的Redis可视化客户端汇总

    因为 Redis 官方只提供了命令行版的 Redis 客户端 redis-cli,以至于我们在使用的时候会比较麻烦,通常要输入一堆命令,而且命令行版的客户端看起来也不够直观,基于以上两个原因我们需要找 ...

  5. python查看所有异常类_Python调试常见异常汇总

    以下就是常见的异常以及其中文描述. BaseException --所有异常的基类 SystemExit --解释器请求退出 KeyboardInterrupt --用户中断执行(通常是输入^C) E ...

  6. 【带你重拾Redis】Redis常见知识点

    什么是Redis? Redis是一个使用ANSI C语言编写,遵守BSD协议规范的开源的K-V类型的NoSQL数据库服务器. Redis是当前最流行的K-V类型的NoSQL数据库之一,在通往系统架构的 ...

  7. Redis:常见的面试题

    Redis的那些最常见面试问题 先把这些面试题给浏览一遍,大概知道redis的一些相关名词,接下来几篇博客才会继续的详细一些写redis的一些特性~~然后慢慢把redis学会. 1.什么是Redis? ...

  8. 写一段代码提高内存占用_记录一次生产环境中Redis内存增长异常排查全流程!...

    点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达 最近 DBA 反馈线上的一个 Redis 资源已经超过了预先设计时的容量,并且已经进行了两次扩容,内存增长还在持续中,希望业务方排查一下容量 ...

  9. 新编php找工作常见面试笔试汇总

    今天偶然看到了一篇文章,说是php程序员在找工作当中常见的问题汇总,我觉得不错.特意转来了.收藏. form表单 1.简述 POST 和 GET 传输的最大容量分别是多少? GET 方法提交的表单数据 ...

最新文章

  1. 2022-2028年中国酱腌菜行业市场研究及前瞻分析报告
  2. 推荐爱奇艺开源的高性能网络安全监控引擎!
  3. 【转】Usage of sendBroadcast()
  4. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等...
  5. sqlserver数据恢复(100%可用)
  6. STL:大小写字母转换、字符转数字、char*转string(未完待续)
  7. vue动态生成下拉框_vue+elementui 动态创建下拉框
  8. 顺序容器之vector
  9. SpringBoot:如何处理SprintBoot提示Whitelabel Error Page以及了解原因?
  10. 内核全新优化UI界面影视双端源码
  11. Linux学习笔记---网线直连电脑和开发板使用nfs下载文件
  12. 三个关键词,看懂AI未来趋势丨不仅仅是高薪
  13. 敏捷遇上UML—软创基地马年大会(广州站 2014-4-19)
  14. 字符串常量强制转换为字符指针
  15. 【算法笔记】求给定序列的第k大(权值线段树/直接离散化)
  16. WinForm 分屏 [ WinForm | Panel | 视频监控分屏 ]
  17. DenseNet网络结构详解及代码复现
  18. 抖音创作规范_抖音创作内容调整提示怎么办
  19. 虚拟机里博图能连接上实物PLC,但是HMI仿真不能连接实物PLC
  20. 入学校计算机社团申请书,学校社团成立申请书

热门文章

  1. 大厂面试常问的机器学习,计算机视觉怎么学?详细指南来了!
  2. cnocr:用来做中文OCR的Python3包,装上就能用!
  3. 超详细目标检测,yolo3训练自己的数据集
  4. python读写csv与数据库性能_使用python将csv文件写入SQL Server数据库
  5. python 类和对象 有必要学吗_Python学习——对类和对象的初步理解,初识,与
  6. 数据结构经典案例_计算机领域必读的经典书籍清单
  7. [认证] 丢掉盔甲,我们依然是骄傲的骑士——Secooler“三问四看”话认证培训...
  8. Android仿人人客户端(v5.7.1)——通过HTTPS协议的POST方式获取用户的基本信息
  9. codeforce #165 div2
  10. Cocos2dx 下面,对 音乐 和音效简单封装