根治方法:1. 增加连接池最大连接数和最小空闲连接数,例如maxTotal=100, maxIdle=20, minIdle=10;2. 设置合理的连接超时和最大等待时间,如timeout=2000ms, maxWaitMillis=5000;3. 启用连接验证testOnBorrow=true, testOnReturn=true, testWhileIdle=true;4. 配置定期销毁空闲连接timeBetweenEvictionRunsMillis=60000, minEvictableIdleTimeMillis=300000;5. 监控连接使用情况,及时释放连接;6. 使用连接池预热,在应用启动时初始化部分连接。
方案一
在使用JedisPool时,经常遇到连接池耗尽的问题,主要原因是程序没有正确关闭连接,或者连接泄漏。解决办法是确保每次使用完Jedis实例后调用close()方法释放连接到池中。同时调整池配置:poolConfig.setMaxTotal(200); poolConfig.setMaxIdle(50); poolConfig.setMinIdle(10); 这样可以有效缓解空闲连接不足的情况。
方案二
Redis连接池空闲连接耗尽异常,通常是因为空闲时间过长被服务器关闭,但池中还持有无效连接。配置JedisPoolConfig:config.setTestOnBorrow(true); config.setTestWhileIdle(true); config.setTimeBetweenEvictionRunsMillis(30000); config.setMinEvictableIdleTimeMillis(60000); config.setNumTestsPerEvictionRun(10); 这些参数能自动检测和清理无效连接。
方案三
运维发现大量Redis连接异常,是因为业务高峰期并发激增,连接池大小不足。建议将maxTotal调到500以上,根据QPS估算:QPS * 平均RT / 1000 * 连接复用率。并使用Lettuce客户端替换Jedis,它支持异步和响应式编程,更好管理连接。同时开启TCP-KEEPALIVE,keepalive 300。
方案四
连接池空异常频发,根源在于没有预热和销毁策略。应用启动时预热连接池:for(int i=0; i 在Spring Boot中使用@Bean配置RedisTemplate时,设置LettucePoolingClientConfiguration:GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); poolConfig.setMaxTotal(1000); poolConfig.setMaxIdle(200); poolConfig.setMinIdle(50); poolConfig.setTestOnBorrow(true); 这样能显著降低运维成本,避免频繁重启。 问题排查步骤:1. 检查日志中是否有close()遗漏;2. 使用show命令查看Redis当前连接数;3. 监控连接池活跃/空闲连接指标;4. 压力测试验证配置。最终解决方案是结合业务限流+连接池优化,彻底根治瓶颈。 FAQ方案五
方案六
Q: 为什么Redis连接池会突然耗尽?
A: 主要是连接泄漏、配置不当或突发流量导致。
Q: Jedis和Lettuce哪个更好防空池异常?
A: Lettuce支持异步,更适合高并发,推荐使用。
Q: 如何监控连接池状态?
A: 集成Micrometer或自定义JMX暴露指标。
Q: 连接超时怎么设置?
A: timeout=2000ms, connectTimeout=1000ms即可。