日常排雷:redis报错 could not get a resource from the pool

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);

再运行调试,搞定~~收工~~

 

posted @ 2020-03-11 16:13  小猴子下山  阅读(1120)  评论(0编辑  收藏  举报