返回顶部
首页 > 资讯 > 数据库 >Jedis使用中常见的客户端异常情况有哪些
  • 222
分享到

Jedis使用中常见的客户端异常情况有哪些

2024-04-02 19:04:59 222人浏览 八月长安
摘要

这篇文章给大家分享的是有关Jedis使用中常见的客户端异常情况有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、无法从连接池获取到连接JedisPool中的Jedis对象个

这篇文章给大家分享的是有关Jedis使用中常见的客户端异常情况有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

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

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 object
 at 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 exhausted
 at 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的重要属性Jedis使用中常见的客户端异常情况有哪些

Jedis使用中常见的客户端异常情况有哪些

感谢各位的阅读!关于“Jedis使用中常见的客户端异常情况有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

您可能感兴趣的文档:

--结束END--

本文标题: Jedis使用中常见的客户端异常情况有哪些

本文链接: https://lsjlt.com/news/55809.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Jedis使用中常见的客户端异常情况有哪些
    这篇文章给大家分享的是有关Jedis使用中常见的客户端异常情况有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、无法从连接池获取到连接JedisPool中的Jedis对象个...
    99+
    2024-04-02
  • Kafka有哪些常见的客户端应用程序
    Kafka有许多常见的客户端应用程序,其中一些包括: Apache Kafka工具集:Apache Kafka本身提供了一些工具...
    99+
    2024-03-11
    Kafka
  • java中的常见异常有哪些
    1、java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经...
    99+
    2015-01-05
    java基础 java 常见 异常
  • Java中有哪些常见的异常
    这篇文章主要介绍“Java中有哪些常见的异常”,在日常操作中,相信很多人在Java中有哪些常见的异常问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中有哪些常见的异常”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-03
  • java常见内存泄露情况有哪些
    在Java中,常见的内存泄露情况有以下几种:1. 对象无法被回收:当一个对象不再被引用,但是它仍然被某些其他对象引用,导致垃圾回收器...
    99+
    2023-08-31
    java
  • java常见内存泄露的情况有哪些
    Java常见的内存泄漏情况包括: 对象未被正确释放:当一个对象不再被使用时,如果没有正确释放它所占用的内存,那么该对象就会造成内...
    99+
    2024-02-29
    java
  • 常用的MySQL客户端工具有哪些
    这篇文章主要介绍“常用的MySQL客户端工具有哪些”,在日常操作中,相信很多人在常用的MySQL客户端工具有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”常用的MySQL...
    99+
    2024-04-02
  • Winform中C#线程控制的常见情况有哪些
    本篇内容主要讲解“Winform中C#线程控制的常见情况有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Winform中C#线程控制的常见情况有哪些”吧!Winform界面中,将事务放在新开...
    99+
    2023-06-17
  • java的常见异常有哪些
    1、NullPointerException:空指针异常,当操作一个 null 对象的方法或属性时会抛出这个异常。是一个很头疼的异常,因为它是运行时异常,不需要手动捕获,但运行时碰到这个异常会中断程序。 (推荐学习:j...
    99+
    2018-01-05
    java入门 java
  • Python常见的异常有哪些
    这篇文章主要介绍“Python常见的异常有哪些”,在日常操作中,相信很多人在Python常见的异常有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python常见的异常有哪些”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-16
  • 常见的Java异常有哪些
    本篇文章为大家展示了常见的Java异常有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,...
    99+
    2023-06-16
  • 在java中常见的异常类有哪些
    java中常见的异常类有:NullPointerException:当应用程序试图访问空对象时,则抛出该异常。SQLException:提供关于数据库访问错误或其他错误信息的异常。IndexOutOfBoundsException:指示某排...
    99+
    2024-04-02
  • python异常中常见关键字有哪些
    小编给大家分享一下python异常中常见关键字有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、说明try:在try…except块中使用,它定义了一个代码...
    99+
    2023-06-15
  • MYSQL同步报错故障处理的常见情况有哪些
    这篇文章主要介绍了MYSQL同步报错故障处理的常见情况有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 常...
    99+
    2024-04-02
  • 常用语言Hhttp请求客户端的框架有哪些
    这篇文章主要介绍“常用语言Hhttp请求客户端的框架有哪些”,在日常操作中,相信很多人在常用语言Hhttp请求客户端的框架有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • Ubuntu邮件客户端Thunderbird常用的快捷键有哪些
    这篇文章给大家分享的是有关Ubuntu邮件客户端Thunderbird常用的快捷键有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。快捷键名称 所具备的功能Ctrl+M Ctrl+N 新建邮件Ctrl...
    99+
    2023-06-13
  • mysql日常使用中常见的报错有哪些
    这篇文章主要讲解了“mysql日常使用中常见的报错有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql日常使用中常见的报错有哪些”吧!1)输入MY...
    99+
    2023-03-09
    mysql
  • 客户管理的常用软件有哪些
    客户管理的常用软件有哪些,除了CRM客户关系管理系统外,以下为几种常见的客户管理软件: 1.微信客户管理软件微信客户管理软件是一款专门用于微信营销、客户管理的软件。它可以帮助企业实现微信营销、客户关系管理和数据分析等功能,帮助企业更好地了解...
    99+
    2023-12-28
    常用软件 客户 有哪些
  • mongodb常见的异常日志信息有哪些
    Connection error: 连接到数据库时发生错误,可能是网络问题、认证问题等导致连接失败。 Query error: 查...
    99+
    2024-04-02
  • 美国服务器无法正常使用的情况有哪些
    美国服务器无法正常使用的情况有:1、美国服务器硬件设备出现故障导致;2、美国服务器搭建的网站程序使服务器负担过重导致;3、业务规模扩大,美国服务器无法满足当前业务需求时导致;4、其他问题,如服务器受到攻击、机房环境、网络环境等因素所导致。具...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作