redis 报错 could not get a resource from the pool
今天遇到一个问题
在模拟环境上进行测试,调用redis获取数据时报错,提示 could not get a resource from the pool
报错代码,以下红色字体:
1 try(Jedis jedis = POOL.getResource()) {
2 return jedis.get(key);
3 }
于是进行排查,本地开发环境调试,发现正常啊,啥情况?
难道本地环境和模拟环境有啥差异???
- 模拟环境的用户多,操作redis量也多,实例使用后没用被释放导致的?
于是,本地建立循环 20000次 获取实例不释放,int i=0;while(i<20000){Jedis jedis = POOL.getResource();i++ }
结果:正常!!!难道不是这么测的?先排除这种问题的可能
试试其它法子:
假设是模拟环境的操作量过多未释放,那么重启模拟环境服务,即可以初始化redis连接池,重启后立即去操作报错功能试试
发现操作完,还是报同样错误
结论:不是实例使用后没有被释放的问题导致
- 本地环境和模拟环境的redis配置不一样?
不是释放导致的,那只有这种可能
叫运维帮忙拉取配置自己进行对比,发现除了ip、端口、密码不一样,其它都一样。
等等,本地环境的redis有密码,验证环境的redis 密码为空,难道是这个引起?
于是叫运维设置一下验证环境redis 的密码。。。沟通失败。。没设置成功,
那只能自己本地测试了,redis 空字符串密码是不是有啥问题?
本地运行:确实空字符串密码, POOL.getResource() 直接报 could not get a resource from the pool
问题找到,密码的问题!!
- 开始解决
百度查询redis 空(null)密码 和空字符("")密码,是否有区别,发下确实有人遇到类似问题!!!
以下截图百度出来的:
既然这样,那就把“” 和 null 需要区别开来,方案:如果redis配置密码为空“”, 代码里直接设置把密码设置成null
代码:
redis配置:
1 redis: 2 database: 8 3 host: 192.168.0.101 4 port: 6379 #新的实例 5 password: # 密码(默认为空) 6 timeout: 6000 # 连接超时时长(毫秒)
java 代码:
1 @Value("${spring.redis.password}") 2 private String jedisPassword; 3 4 //新增密码处理 5 //把""设置成null 6 if ("".equals(jedisPassword.trim())) { 7 jedisPassword = null; 8 } 9 JedisPool pool = new JedisPool(config, jedisHost, jedisPort, 0, jedisPassword);
再运行调试,搞定~~收工~~