redis客户端常见异常

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JYL15732624861/article/details/82380457

1、无法从连接池获取到链接
JedisPool中jedis对象个数有限,默认是8个。这里假设使用的默认配置,如果有8个jedis对象被占用,而且没有归还,此时调用者再借用jedis时就需要等待,如果等待时间maxWaitMillis时间内仍无法收到获取到jedis对象则抛出NoSuchElementException异常cannot get a resource from the pool
如果设置了bolckWhenExhausted=false也会抛出NosuchElementException异常。
解决思路:为什么连接池没有资源了

  • 高并发下连接池的最大连接数太小,供不应求会等待,等待时间长会报错。只要增大连接数
  • 没有释放连接池,即借用没有归还。顺便看一下jedis.close的源码,close会判断是否有连接,若存在连接关闭当前连接,若连接点都归还才会释放。
  • 存在慢查询操作
  • 服务端阻塞

2、客户端读写超时SocketTimeoutException:Read time out

  • 超时时间设置过短
  • 命令执行慢
  • 网络异常

3、客户端连接超时 SocketTimeoutException:connect time out

  • 连接超时设置过短 jedis.getClient().setConnectionTimeout(time);
  • redis阻塞,tcp-backlog已满,新连接失败
  • 网络异常
    4、客户端缓冲区异常 Unexpected end of stream

  • 输出缓冲区满,config set client-output-buffer-limit “normal 1048576 1048576 60 slave 268435456 67108864 60 pubsub 33554432 8388608 60”将输出缓冲区设置为1M 1M 60,然后获取一个bigkey(如3M)会出现异常

  • 长时间闲置连接服务端主动断开
  • jedis对象同时被多个线程并发操作

5、Basy redis is busy running a script.Lua脚本正在运行,超过了lua-time-out
6、Loading redis is loading the dataset in memory.redis正在加载持久化文件
7、redis使用内存超过maxmemory配置,OOM command not allowed when used memoey>’maxmemory’
8、客户端连接数过大,超过maxclients,ERR max number of clients reached.此时新的客户端连接执行命令会报此异常。这个问题要尽快找到问题所在,否则一段时间后必然会超过连接数

  • 首先排除maxclients很小的情况,如果是分布式结构的话,可以通过下线部分节点,先将连接数降下来,然后修复bug。
  • 服务端故障转移

猜你喜欢

转载自blog.csdn.net/JYL15732624861/article/details/82380457