Redis报错:JedisConnectionException: Could not get a resource from the pool
1、问题描述:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
2、简要分析:
redis.clients.util.Pool.getResource会从JedisPool实例池中返回一个可用的redis连接。分析源码可知JedisPool 继承了 redis.clients.util.Pool ,而这个Pool是通过commons-pool开源工具包中的org.apache.commons.pool2.impl.GenericObjectPool来实现对Jedis实例的管理的。所以我们分析一下GenericObjectPool或许能找到答案。
其中GenericObjectPool三个重要个几个属性是:
MaxActive: 最大连接数
MaxIdle: 最大空闲数
MaxWait: 最大等待时间,单位毫秒(million seconds)
连接池中无可用连接时会会进行等待maxWait时间,若超出泽抛Could not get a resource from the pool异常。所以应根据程序实际情况合理设置这三个参数的值,尽量避免这个异常。
分析结果:
如果连接池没有可用Jedis连接,会等待maxWaitMillis(毫秒),依然没有获取到可用Jedis连接,会抛出这个异常:redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
3、发生异常可能的情况
异常原因一、客户端没有从连接池(最大maxTotal个)拿到可用Jedis连接造成的【简称连接泄露 (常见)】
分析图如下:
JedisPool默认的maxTotal=8,下面的代码从JedisPool中借了8次Jedis,但是没有归还,当第9次(jedisPool.getResource().ping())
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) {logger.error(e.getMessage(), e);}
}
jedisPool.getResource().ping();
所以推荐使用的代码规范是:
执行命令如下:
Jedis jedis = null;
try {jedis = jedisPool.getResource();//具体的命令jedis.executeCommand()
} catch (Exception e) {//如果命令有key最好把key也在错误日志打印出来,对于集群版来说通过key可以帮助定位到具体节点。logger.error(e.getMessage(), e);
} finally {//注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。if (jedis != null) jedis.close();
}
异常原因二: 业务并发量大,maxTotal确实设置小了!
举个例子:
一次命令时间(borrow|return resource + Jedis执行命令(含网络) )的平均耗时约为1ms,一个连接的QPS大约是1000,业务期望的QPS是50000,那么理论上需要的资源池大小是50000 / 1000 = 50个,实际maxTotal可以根据理论值合理进行微调。
异常原因三: Jedis连接还的太慢
例如Redis发生了阻塞(例如慢查询等原因),所有连接在超时时间范围内等待,并发量较大时,会造成连接池资源不足。
异常原因四: 其他问题
例如丢包、DNS、客户端TCP参数配置,具体可以参考:Jedis介绍及常见问题分析
异常原因五: 检查Redis的配置是否正确,IP端口【值得反思】
4、解决方案:
1、检查Redis的配置是否正确,IP端口【值得反思】
2、调整配置参数。但是,不要被异常的表象所迷惑,简单地认为连接池不够就盲目加大maxTotal,要具体问题具体分析。连接池参数优化可以参考:JedisPool资源池优化
3、客户端没有从连接池(最大maxTotal个)拿到可用Jedis连接造成的,简称连接泄露 (常见),所以推荐使用的代码规范是如下:
执行命令如下:
Jedis jedis = null;
try {jedis = jedisPool.getResource();//具体的命令jedis.executeCommand()
} catch (Exception e) {//如果命令有key最好把key也在错误日志打印出来,对于集群版来说通过key可以帮助定位到具体节点。logger.error(e.getMessage(), e);
} finally {//注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。if (jedis != null) jedis.close();
}
参考:Jedis常见异常汇总 | 程序猿DD
相关文章:
Redis报错:JedisConnectionException: Could not get a resource from the pool
1、问题描述: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 2、简要分析: redis.clients.util.Pool.getResource会从JedisPool实例池中返回一个可用的redis连接。分析源码可知JedisPool 继承了 r…...
【广州华锐互动】Web3D云展编辑器能为展览行业带来哪些便利?
在数字时代中,传统的展览方式正在被全新的技术和工具所颠覆。其中,最具有革新意义的就是Web3D云展编辑器。这种编辑器以其强大的功能和灵活的应用,正在为展览设计带来革命性的变化。 广州华锐互动开发的Web3D云展编辑器是一种专门用于创建、编…...
Vue项目实战之一----实现分类弹框效果
效果图 实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"js/vue.js"></script><!-- 引入样式 --><link rel"stylesheet&qu…...
Vue解析器
解析器本质上是一个状态机。但我们也曾提到,正则表达式其实也是一个状态机。因此在编写 parser 的时候,利用正则表达式能够让我们少写不少代码。本章我们将更多地利用正则表达式来实现 HTML 解析器。另外,一个完善的 HTML 解析器远比想象的要…...
Spring Cloud 版本升级遇坑记:OpenFeignClient与Gateway的恩怨情仇
Spring Cloud 版本升级遇坑记:OpenFeignClient与Gateway的恩怨情仇 近日,在对项目中的 Spring Boot、Spring Cloud 以及 Spring Cloud Alibaba 进行版本升级时,遭遇了一个令人头疼的问题:Spring Cloud Gateway 在运行时一直卡住&a…...
面试:Docker相关问题
文章目录 请解释一下什么是 Docker,以及它在云环境中的应用请简述Docker和LXC的区别什么是Docker Compose?请简述其作用和使用场景在使用Docker时,如何为容器创建一个可访问的网络当一个Docker容器运行异常时,如何通过Docker命令查…...
移动端浏览器 jquery 获取 pdf blob文件流 预览pdf
最近遇到一个需求,一个古早的移动端 juery 项目要求做一个页面,从接口获取 pdf 文件流,然后预览出来 这里使用第三方工具:pdf.js 代码如下: // 引入相关文件<script src"../js/pdf.js" type"text…...
Redis并发问题解决方案
目录 前言 1.分布式锁 1.基于单个节点 2.基于多个节点 3.watch(乐观锁) 2.原子操作 1.单命令操作 2.Lua 脚本(多命令操作) 3.事务 1.执行步骤 2.错误处理 3.崩溃处理 总结 前言 在多个客户端并发访问Redis的时候,虽然Redis是单线程执行指令ÿ…...
读取两个文件夹里不同名的文件,处理映射不对应的文件
解决方案:读取两个文件夹里不同名的文件,处理映射不对应的文件 # -*- coding: utf-8 -*- import ospath1 r/home/ubuntu/data/yoloData/images/train2017 path2 r/home/ubuntu/data/yoloData/labels/train2017def read_all_file_name():file_path ./t…...
SpringCloud原理-OpenFeign篇(四、请求原理)
文章目录 前言正文一、书接上回,从代理对象入手二、ReflectiveFeign.FeignInvocationHandler#invoke()三、SynchronousMethodHandler#invoke(...) 的实现原理3.1 invoke(...)源码3.2 executeAndDecode(...) 执行请求并解码 四、如何更换client 的实现 附录附1&#…...
什么是工业物联网(IOT)?这样的IOT平台你需要吗?——青创智通
物联网(IOT)是指在互联网上为传输和共享数据而嵌入传感器和软件的互联设备的广泛性网络。这允许将从物理对象收集的信息(数据)存储在专用服务器或云中。通过分析这些积累的信息,通过提供最优的设备控制和方法,可以实现一个更安全、更方便的社会。在智能家…...
MTK Pump Express 快速充电原理分析
1 MTK PE 1.1 原理 在讲正文之前,我们先看一个例子。 对于一块电池,我们假设它的容量是6000mAh,并且标称电压是3.7V,换算成Wh(瓦时)为单位的值是22.3Wh(6000mAh*3.7V);普通的充电器输出电压电流是5V2A(10W),…...
leetcode刷题记录——1991. 找到数组的中间位置
找到数组的中间位置 给你一个下标从 0 开始的整数数组 nums ,请你找到 最左边 的中间位置 middleIndex (也就是所有可能中间位置下标最小的一个)。 中间位置 middleIndex 是满足 nums[0] nums[1] … nums[middleIndex-1] nums[middleInd…...
跨域攻击分析和防御(上)
点击星标,即时接收最新推文 跨域攻击 在大型公司或大型跨国企业中都拥有自己的内网,跨国公司都有各个子公司一般以建立域林进行共享资源。根据不同职能区分的部门,从逻辑上以主域和子域进行划分以方便统一管理。在物理层使用防火墙将各个子公…...
GEE:梯度提升树(Gradient Boosting Tree)分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积)
作者:CSDN @ _养乐多_ 本文将介绍在Google Earth Engine (GEE)平台上进行梯度提升树(Gradient Boosting Tree)分类的方法和代码,其中包括制作样本点教程(本地、在线和本地在线混合制作样本点,合并样本点等),加入特征变量(各种指数、纹理特征、时间序列特征、物候特征…...
ubuntu22.04 arrch64版在线安装redis
脚本 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 echo "deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse" >…...
篮桥云课-摆玩具
思维好题 一开始掉进了二分的陷阱,发现看看逐个位置的差,我们要分成k段就是要取消k-1个最大的逐差 然后将剩余的加起来就可以了 因为本体保证是从小到大给出的 这一点保证了答案的正确性,自己没想出来 还是太菜了 #include<bits/stdc.h&…...
【python】python进阶知识点
eval函数用法 函数参数:字符串 # 计算表达式 print(eval("12*3")) # 把字符串当成python程序运行 print(eval("random.random()")) # 字符串转成列表 print(type(eval("[1,2,3,4]"))) # 字符串转成字典 print(type(eval("{name…...
LeetCode算法题解(动态规划)|LeetCode322. 零钱兑换、LeetCode279. 完全平方数
一、LeetCode322. 零钱兑换 题目链接:322. 零钱兑换 题目描述: 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一…...
Python Web开发基础知识篇
一,基础知识篇 本片文章会简单地说一些python开发web中所必须的一些基础知识。主要包括HTML和css基础、JavaScript基础、网络编程基础、MySQL数据库基础、Web框架基础等知识。 1,Web简介 Web,全称为World Wide Web,也就是WWW,万…...
别再只会用Excel了!用Prism做One-Way ANOVA,从数据到图表5分钟搞定
科研数据分析革命:5分钟用Prism完成One-Way ANOVA全流程 还在为论文里的统计图表熬夜调整格式?每次看到Excel生成的柱状图总觉得少了点"学术气质"?作为经历过无数次数据折磨的科研人,我完全理解这种痛苦。直到遇见Prism…...
静态IPvs动态IP代理:区别解析与多场景选型指南
随着平台风控机制不断升级,IP 地址已成为识别账号关联和异常行为的重要依据。无论是跨境电商、多账号运营、数据采集还是 AI 自动化任务,频繁更换或共享 IP 都可能触发平台检测,影响账号稳定性与安全性。因此,代理 IP 正逐渐成为多…...
【路由器配置-ACL访问控制列表】
路由器配置-ACL访问控制列表一、概念二、配置1、定义ACL2、接口使用ACL一、概念 1.ACL访问控制列表,是路由器 / 交换机上的一组规则,用来匹配数据包,决定 “允许(permit)” 还是 “拒绝(deny)”…...
HarmonyOS6 Tabs 组件完全指南:从零上手底部导航
文章目录一、Tabs 组件是什么?二、核心结构三、基础接口说明四、基础用法示例4.1 最简单的底部标签栏4.2 带系统图标的标签栏4.3 完全自定义标签(推荐方式)五、重要属性一览5.1 barMode — 标签栏排列模式5.2 scrollable — 是否允许手势滑动…...
STM32F103驱动无刷电机:手把手教你配置TIM1互补PWM(含六步换向代码)
STM32F103驱动无刷电机:从硬件配置到六步换向实战指南 在嵌入式开发领域,无刷电机控制一直是极具挑战性的课题。不同于传统有刷电机,无刷电机凭借高效率、长寿命和低噪音等优势,正逐步取代传统电机在工业自动化、无人机和智能家居…...
如何告别焦虑等待:Elsevier Tracker让学术投稿进度一目了然
如何告别焦虑等待:Elsevier Tracker让学术投稿进度一目了然 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 还在每天刷新Elsevier投稿页面,焦虑地等待审稿状态更新吗?Elsevier Tr…...
高端地铁/轻轨门控系统控制器功率器件选型方案——高可靠、长寿命与安全驱动系统设计指南
随着城市轨道交通向智能化、高密度运营方向发展,高端地铁与轻轨的门控系统作为保障乘客安全与运营效率的关键执行单元,其驱动控制器的可靠性、响应速度及环境适应性要求极为严苛。功率开关器件作为驱动器的核心,直接决定了系统的开关损耗、热…...
保姆级教程:用Arduino IDE 1.8.19给ESP32-CAM烧录CameraWebServer(附离线包下载)
ESP32-CAM零基础实战指南:从环境搭建到实时监控一气呵成 当拆开ESP32-CAM包装的瞬间,多数初学者会被这个火柴盒大小的智能摄像头模块震撼——它兼具Wi-Fi连接与图像处理能力,价格却不到百元。但紧接着就会陷入开发环境配置的泥潭:…...
终极指南:如何免安装Office快速预览Word、Excel和PPT文件
终极指南:如何免安装Office快速预览Word、Excel和PPT文件 【免费下载链接】QuickLook.Plugin.OfficeViewer Word, Excel, and PowerPoint plugin for QuickLook. 项目地址: https://gitcode.com/gh_mirrors/qu/QuickLook.Plugin.OfficeViewer 想要在不安装庞…...
保姆级教程:用rosbag录制和回放你的第一个机器人实验(附Python/C++代码)
从零玩转rosbag:机器人实验数据录制与回放实战指南 刚接触ROS时,最让人兴奋的莫过于让机器人动起来的那一刻。但每次重新运行都要从头开始操作?想分享给同事看却要现场演示?这时候你就需要掌握rosbag这个"机器人黑匣子"…...
