最近有个项目中的redis每天都会报 "Could not get a resource from the pool"的错误,而这套代码在另一地方部署又没有问题。一直找不到错误原因。按字面意思是连接池中资源不够。

1. 有可能是并发太高而连接池太小,尝试修改连接池上限来解决问题,修改方法如下:

  <!-- redis连接池的配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${spring.redis.maxTotal}"/>
<property name="maxIdle" value="${spring.redis.maxIdle}"/>
<property name="minIdle" value="${spring.redis.minIdle}"/>
<property name="testOnBorrow" value="${spring.redis.testOnBorrow}"/>
<property name="testOnReturn" value="${spring.redis.testOnReturn}"/>
</bean>

修改 maxTotal 到 60 100 300,可以改变连接池大小

spring.redis.maxTotal=8
spring.redis.maxIdle=8
spring.redis.minIdle=1
spring.redis.testOnBorrow=true
spring.redis.testOnReturn=true

将连接池上限修改到很大,运行后发现还是没有解决,仍然报错,有时还会报 "clusterdown the cluster is down"。将maxIdle与minIdle调大,也是一样没有效果。

2. 有网友说有可能是redis连接没有被释放,连接池设再大也没用。项目使用了spring-data-redis,按理释放是不需要自己处理的,项目使用的配置如下:

  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory" />
<property name="keySerializer" ref="stringRedisSerializer" />
<property name="hashKeySerializer" ref="stringRedisSerializer" />
<property name="valueSerializer" ref="stringRedisSerializer"/>
</bean>

这里并没有使用redis事务功能,默认情况下 RedisTemplate 的 enableTransactionSupport = false, 所以不需要手动释放连接。

关于开启事务后手动释放的代码,参考这里(https://www.cnblogs.com/DDgougou/p/10268206.html)

3.网上有网友说有可能是jedis版本的问题,当前项目使用的版本为:

    <dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>

更新到2.9.3,继续测试。

    <dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.3</version>
</dependency>

测试发现,提示终于有变化了,不再显示"Could not get a resource from the pool",但问题还是没有解决,因为项目使用集群的原因,变成提示"Too many Cluster redirections",这是什么鬼???确实没有了连接池的错误提示,但又出现新的问题。

4. 检查redis集群,"Too many Cluster redirections"的意思是连不上其中一个节点,尝试连另一个配置的节点,如果都连不上,就会提示这个错误。检查redis集群方法如下:

利用redis-cli命令进行远程检查

redis-cli -h 127.0.0.1 -p
// 连接成功 如果设置了密码,需要运行命令 auth xxx xxx为密码
运行 cluster info 检查

执行结果,集群正常

xxx:> cluster info
cluster_state:ok
cluster_slots_assigned:
cluster_slots_ok:
cluster_slots_pfail:
cluster_slots_fail:
cluster_known_nodes:
cluster_size:
cluster_current_epoch:
cluster_my_epoch:
cluster_stats_messages_sent:
cluster_stats_messages_received:
(.53s)

集群没问题,但总会偶尔连不上,因为把做了3个节点(redis与mysql装在同一台服务器上),全连不上的机率不大,所以最大的可能就是服务器或者服务器的网络出问题,造成"Too many Cluster redirections"这个错误的发生。

最后通过观察发现出错的规律,当mysql在执行一个很耗时的存储过程CPU高得飞起时,就很容易出现报错的情况。最终基本确定是服务器突然卡引起的异常,所以才会一会正常偶尔又会报错。

经过一天的验证与解决,出现"Could not get a resource from the pool"进的解决方法总结如下:

1. 参数问题,有可能是连接池太小引起

2. jedis版本问题引起

3.服务器性能引起

最终把redis移到另一台服务器上,问题解决。

最新文章

  1. [mobile开发碎碎念]手机页面上显示PDF文件
  2. 纯CSS实现Tooltip
  3. objective-c系列-单例
  4. 数据库开发基础-SQl Server 聚合函数、数学函数、字符串函数、时间日期函数
  5. windows环境下Django安装配置
  6. Windows Server 2003服务器无法下载.exe文件的解决方法
  7. python 字符串编码
  8. 【python游戏编程之旅】第二篇--pygame中的IO、数据
  9. win7-opengl开发环境的搭建
  10. uimodalpresentationformsheet resize ios7
  11. c# 模拟http post 带cookie
  12. jQuery下实现检测指定元素加载完毕
  13. 03:CDN原理
  14. js day01
  15. KBEngine 编译出现 MSB802 无法找到v140的生成工具
  16. hdu5293 lca+dp+树状数组+时间戳
  17. String 练习
  18. GreenPlum数据库安装
  19. 带你走进ajax(4)
  20. POJ 2991 Crane (线段树)

热门文章

  1. mysql 选出前五个元素
  2. Apache ranger整合hive报错记录
  3. dockerfile文件语法命令
  4. css3实现左侧固宽,右侧随着屏幕,右侧随着屏幕变化而变化
  5. k8s 传参给docker env command、args和dockerfile中的entrypoint、cmd之间的关系
  6. linux系统上传下载命令rz和sz的教程
  7. osg::Group源码
  8. 解决python写入mysql中datetime类型遇到的问题
  9. [LeetCode] 502. IPO 上市
  10. Kubernetes 集群日志管理 Elasticsearch + fluentd(二十)