• 日常排雷: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);

    再运行调试,搞定~~收工~~
  • 相关阅读:
    mapreduce 的过程
    bootstrap当中,实现一些常用的元素居中
    如何理解人工智能、机器学习和深度学习三者的关系
    MapReduce的局限性
    MapReduce的计算资源划分
    Java中的堆和栈的区别
    java面试01-网络知识
    01Java经典问题
    06数据库复习03
    05数据库复习02
  • 原文地址:https://www.cnblogs.com/xiaohouzixiashan/p/12463069.html
Copyright © 2020-2023  润新知