使用Jedis时常见的客户端异常有哪些?

分类:编程技术 时间:2024-02-20 15:25 浏览:0 评论:0
0
本文将与大家分享Jedis使用中一些常见的客户端异常。小编觉得还是比较实用的,所以分享给大家,作为参考。下面就跟随小编来看看吧。

1.无法从连接池获取连接

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

redis.clients.jedis.exceptions.JedisConnectionException:无法从池中获取资源...引起:java.util.NoSuchElementException:等待超时org.apache.commons.pool2.impl.GenericObjectPool.borrowObj 处的空闲对象ect(GenericObjectPool.java:449)

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

redis.clients.jedis.exceptions.JedisConnectionException:无法从池中获取资源...引起:java.util.NoSuchElementException:池耗尽于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;尝试 { jedis = jedisPool.getResource(); jedis.ping(); } catch (Exception e) { e.printStackTrace(); }} 

当调用者从连接池借用Jedis时(如下),会抛出异常:

jedisPool.getResource().ping();< /code>

3.客户端:查询操作缓慢。这些慢速查询所持有的 Jedis 对象会缓慢返回,导致池满。

4.服务器:客户端正常,但是Redis服务器由于某些原因阻塞了客户端命令执行过程,也会导致客户端抛出此异常。可见,造成这种异常的原因有很多。不要被异常的外观所迷惑。没有万能钥匙可以解决所有问题。开发和运维只能不断加强对Redis的了解,顺着线索逐步发现问题。地点。

2.客户端读写超时

Jedis调用Redis时,如果出现读写超时,会出现如下异常:

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

此异常的原因也有以下几种:

读写超时设置太短。
命令本身相对较慢。
客户端与服务器端网络异常。
Redis本身被阻塞。

3.客户端连接超时

Jedis调用Redis时,如果出现读写超时,会出现如下异常:

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

此异常的原因也如下: 类别:

连接超时设置太短。
Redis被阻塞,导致tcp-backlog已满,导致新连接失败。
客户端与服务器端网络异常。

4.客户端缓冲区异常

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

redis.clients.jedis.exceptions.JedisConnectionException:流意外结束。

出现此异常的原因可能有以下几种::

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

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

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

2.如果长期空闲的连接被服务器主动断开,可以检查超时配置设置以及自身的连接池配置是否需要空闲检测。

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

5. Lua脚本正在执行

如果Redis当前正在执行Lua脚本并且超过了lua-time-limit,当Jedis调用Redis时,您将收到以下异常。如何应对此类问题(Lua lua-time-limit配置在上一章已经介绍过)

redis.clients.jedis.exceptions.JedisDataException: BUSY Redis 正忙于运行脚本。您只能调用 SCRIPT KILL 或 SHUTDOWN NOSAVE。

6. Redis正在加载持久文件

当Jedis调用Redis时,如果Redis正在加载持久文件,那么您将收到以下异常。

redis.clients.jedis.exceptions.JedisDataException: LOADING Redis 正在将数据集加载到内存中

7. Redis 使用的内存超过 maxmemory 配置

当 Jedis 调用 Redis 执行写操作时,如果 Redis 使用的内存大于 maxmemory 设置,则会收到以下异常。这时候就应该调整maxmemory,并找到问题的原因。内存增长的原因(maxmemory已经引入d)

redis.clients.jedis.exceptions.JedisDataException:当使用的内存 > ' maxmemory' 时不允许 OOM 命令。

8.客户端连接数太大

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

redis.clients.jedis.exceptions.JedisDataException: ERR max number ofclientsreached

此时新的客户端连接执行任何命令将返回以下结果:

< pre class="brush:js;toolbar:false;">127.0.0.1:6379> get hello(error) ERR max number of requests returned

这个问题可能比较困难,因为 Redis 命令无法执行此时。一般来说,我们可以从两个方面入手。

1. Client:如果maxclients参数不是很小的话,应用程序端的客户端连接数基本都会n不能超过最大客户端数。这通常是由于应用程序端使用Redis客户端不当导致的。这时,如果应用程序端是分布式结构,可以通过拿掉一些应用程序节点(例如占用连接数较多的节点)来减少Redis连接数。这使得大多数节点能够正常运行。这时可以通过查找程序bug或者调整maxclients来修复问题。

2.服务器端:如果此时客户端无法处理,且当前Redis处于高可用模式(如Redis Sentinel、Redis Cluster),则可以考虑对当前Redis进行故障转移。

这个问题目前还没有确定的解决方案,但无论处理哪一方面,故障的快速恢复都极其重要。当然,更重要的是找到问题所在,否则一段时间后客户端连接数就会减少。它仍然会超过 maxclients。

附带重要的GenericObjectPoolConfig 的属性

感谢您的阅读!这篇关于《使用Jedis时常见的客户端异常有哪些》的文章分享在这里。希望以上内容能够给大家带来一些帮助,让大家学到更多的知识。如果您觉得文章不错,可以分享出去,让更多人看到!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 使用Jedis时常见的客户端异常有哪些?

用户评论