欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

redis知识盘点【陆】_客户端Jedis

程序员文章站 2022-05-19 14:06:01
...

系列文章:

redis知识盘点【零】_redis常用命令


redis知识盘点【壹】_基础知识


redis知识盘点【贰】_五种类型


redis知识盘点【叁】_持久化


redis知识盘点【肆】_主从复制和sentinel哨兵


redis知识盘点【伍】_一致性哈希和cluster集群


redis知识盘点【陆】_客户端Jedis


redis知识盘点【柒】_redis补遗


本篇文章主要介绍一下redis的客户端Jedis。


首先明确两点:一、redis客户端与服务端之间的通信协议是在TCP协议之上构建的;二、Redis制定了RESP(REdis Serialization Protocol,Redis序列化协议)实现客户端与服务端的正常交互,这种协议简单高效,既能够被机器解析,又容易被人类识别。

 

在java工程中,我们一般使用Jedis作为客户端和redis服务器进行交互,而当我们配置Jedis连接池的时候,有如下参数需要关注:

GenericObjectPoolConfig配置项

redis知识盘点【陆】_客户端Jedis

客户端常见异常


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


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


redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resourcefrom 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 exhausted at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:464)


2.客户端读写超时


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

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


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


1.读写超时间设置得过短;
2命令本身就比较慢;
3客户端与服务端网络不正常;
4·Redis自身发生阻塞;

3.客户端连接超时


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

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

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


1.连接超时设置得过短,可以通过下面代码进行设置:
2.Redis发生阻塞,造成tcp-backlog已满,造成新的连接失败;
3.客户端与服务端网络不正常;

4.客户端缓冲区异常


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"

2)长时间闲置连接被服务端主动断开,上节已经详细分析了这个问题。

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



5.Redis正在加载持久化文件

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

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

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

Jedis执行写操作时,如果Redis的使用内存大于maxmemory的设置,会收到下面的异常,此时应该调整maxmemory并找到造成内存增长的原因:

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

7.客户端连接数过大


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

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