www.cnblogs.com/ruiyqinrui

开源、架构、Linux C/C++/python AI BI 运维开发自动化运维。 春风桃李花 秋雨梧桐叶。“力尽不知热 但惜夏日长”。夏不惜,秋不获。@ruiY--秦瑞

python爬虫,C编程,嵌入式开发.hadoop大数据,桉树,onenebula云计算架构.linux运维及驱动开发.

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

redis如何查看当前是哪个数据库

用docker tag 将某个image 归档到某个 仓库,

eg

docker tag image_name docker_hub_name/image:v? 

即可push推送img到docker hub 或是其他你的 docker img 

 

Could not get a resource from the pool 问题解决

今天测试项目的时候,界面提示

Could not get a resource from the pool 报错信息。登录后台,查询对应的java报错日志

报错信息:

 

 

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
到这里可以确定的是redis连接出了问题。

1:检查连接池

进入redis服务器:./redis-cli -h 127.0.0.1 -p 6379 -a passwd

查看当前连接数:INFO clients

 

最近有个项目中的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 9000
// 连接成功 如果设置了密码,需要运行命令  auth xxx   xxx为密码
运行 cluster info 检查

执行结果,集群正常

复制代码
xxx:9000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:187
cluster_my_epoch:186
cluster_stats_messages_sent:111466490
cluster_stats_messages_received:111459674
(1.53s)
复制代码

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

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

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

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

2. jedis版本问题引起

3.服务器性能引起

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

 

查看最大连接数:config get maxclients

 

 

可见,连接池没有任何问题,不存在过载现象。

2:检查本地项目包配置

发现配置文件信息:redis 配置密码错误,或者说是redis服务器密码被修改过,所以导致服务报错。修改为正确密码后刷新生效。

posted on 2022-12-09 10:41  秦瑞It行程实录  阅读(171)  评论(0编辑  收藏  举报
www.cnblogs.com/ruiyqinrui