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

JedisPool中的Jedis对象的个数是有限的,默认是8个,在超过maxWaitMills时间内仍然无法获取则会抛出异常JedisConnectionException:could not get a resource from the pool.....Timeout waiting for idle object。

如果设置了blockWhenExhausted=false,则会立即抛出异常不会进行等待,Pool exhausted

原因分析:

1.客户端:高并发下连接池设置过小,一般情况下比默认值8设置的稍微大一些就可以,JedisPool的处理效率足够高。

2.客户端:没有正确的使用连接池,比如没有释放。

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

4.服务端:Redis的服务端由于一些原因造成客户端命令执行的阻塞

2.客户端写超时

Read time out 读写超时

原因分析:

1.读写超时时间设置的过短

2.命令本身执行的就比较慢

3.客户端与服务端网络不正常

4.Redis自身发生阻塞

3.客户端链接超时

connect time out

原因分析:

1.链接超时设置的过短,jedis.getClient.setConnectionTimeOut()进行设置

2.Redis 发生阻塞,造成tcp-backlog已满,造成新的链接失败。

3.网络不正常

4.客户端缓冲区异常

Jedis咋调用Redis客户端的时候,如果出现客户端数据流异常:Unexpected end of stream

原因分析:

1.输出缓冲区满了,使用get命令获取一个BigKey大于缓冲区的大小就会抛出如上异常

2.长时间闲置的链接被服务端主动断开

3.不正常的并发读写,Jedis对象同事被多个线程并发操作

5.Lua脚本正在执行

Redis正在执行Lua脚本,并且超过了lua-time-limit,抛出BUSY redis is busy running a script

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

Jedis调用Redis的时候,如果正在加载持久化文件,抛出LOADING redis is loading the dataset in memory

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

抛出OOM commad not allowed when used memory > macMemory

8.客户端连接数过大

客户端连接数超过了maxClients,新申请的链接会出现以下异常:ERR max number of clients reached

原因分析:

1.客户端:下线部分应用节点,先让Redis的连接数降下来,保证部分节点正常运行

2.服务端:对异常的节点做故障转移

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐