本篇文章主要讲解,Jedis多线程环境报错:redis Could not get a resource from the pool 的主要原因及解决办法。
作者:任聪聪
日期:2024年10月6日01:29:21
报错信息:
报文:
redis Could not get a resource from the pool
现象:
主要原因:
注意:
1.根本不是网络上所说的那种 需要修改redis配置的。
2.根本不是网络上所说的需要更新redis版本的。
3.根本不是网络上所说的需要更新依赖版本的。
4.根本不是连接远程redis就可以解决的。
5.根本不是多线程问题导致的资源枯竭问题。
根本原因说明:
jedis是一个很成熟的依赖,它本身就完美兼容多线程情况下的redis池分配,无需进行额外的配置和修改,只需要按照规范的写法书写jedis的pool即可。
造成上述的问题的本质是:
1、线程池外泄,没有使用try 方式进行关闭完毕的连接。
2、没有正确实例化线程池,或使用了外部的动态加载初始化连接池。
3、外部引入了配置文件,实例化pool时进行输入参数。
解决办法:
步骤一、实例化我们的线程池通过如下的方式:
public class xxxxUtils {//连接地址private static final String host = "localhost";//端口private static final int port = 6379;//密码private static final String password = null;//数据库private static final int database = 10;//超时时间private static final int timeout = 5000;//前缀private static final String prefixedKey = "rcc666";//最大连接数private static final int maxTotal = 100;//最大空闲数private static final int maxIdle = 20;//最小空闲数private static final int minIdle = 10;//最大等待时间private static final Long maxWaitMillis = 1000L;private static class JedisPoolHolder {private static final JedisPoolConfig poolConfig = new JedisPoolConfig();static {poolConfig.setMaxTotal(maxTotal); // 最大连接数poolConfig.setMaxIdle(maxIdle); // 最大空闲连接数poolConfig.setMinIdle(minIdle); // 最小空闲连接数poolConfig.setMaxWaitMillis(maxWaitMillis); // 获取连接的最大等待时间}private static final JedisPool INSTANCE = new JedisPool(poolConfig, host, port, timeout, password, database);}public static JedisPool getJedisPool() {return JedisPoolHolder.INSTANCE;}//引入方式public void yourFunc() {try (Jedis jedis = getJedisPool().getResource()) {//进行jedis的操作 可以直接jedis.set 或get 同你的方式 这个写法是为了避免线程池资源枯竭 try-catch-swtich 会自动销毁完成的连接} catch (Exception e) {log.error("错误反馈:", e);}}}
备注:使用外部动态配置文件导入配置参数会同样导致jedis报错相同错误,建议此处保持静态。