Jedis连接Redis高并发处理造成连接数降不下来

问题

  • 查看redis连接数,在无处理的情况一值处于高位,shell 命令
 
  while true
  do
  echo "连接数"`netstat -tun | grep 6379 | grep ESTABLISHED | awk '{print $5}' | awk -F':' '{print $1}' | sort | uniq -c`  
  sleep 1s
  done
  

原因:

  • 未将使用后的Jedis放回 资源池,或者为进行关闭,会造成如下错误:
ERR max number of clients reached

java.net.SocketException: 断开的管道 (Write failed) [一开始错误以为是linux服务器性能问题,当然可能回应影响,但不是这个原因造成]

解决

  • 经查询发现,jedis在3.0版本前后,释放资源的方式不一样,如果用错误的方式去关闭资源,是无法将资源关闭或释放
如:使用jedis 2.8.0 调用 jedis.close(),无法使用资源,而是需要使用jedis.returnBrokenResource()

官方解释:

  • jedis 3.0.0以前
Jedis jedis = null;
jedis = redisPool.getResource();
  //  此处业务处理
  
if (jedis != null) 
{
   redisPool.returnBrokenResource(redis);
   jedis = null;   
}
  • jedis 3.0.0 以后
  if (jedis != null) {
        jedis.close();  
        jedis = null;
 }

修改

  • 3.0.0 之前的版本(本次使用 jedis 2.8.0)
 			Jedis jedis ;
 			#集群情况下使用哨兵集群
            JedisSentinelPool jedisSentinelPool = null;
            #单机使用JedisPool
            JedisPool jedisPool = null;
        	
        	#判断是否是集群
            if("true".equals(es_redis_isCluster)){
                jedisSentinelPool = RedisUtil.getJediSentinelPool(redis_isCluster,redis_cluster_name,redis_hostName, redis_port, redis_passWord,redis_database);
                jedis = jedisSentinelPool.getResource();
                jedis.select(Integer.parseInt(redis_database));

            }else{
                jedisPool = RedisUtil.getJedisPool(redis_isCluster,redis_cluster_name,redis_hostName, redis_port, redis_passWord,redis_database);
                jedis = jedisPool.getResource();
                jedis.select(Integer.parseInt(redis_database));

            }

			#释放资源:
			 if("true".equals(es_redis_isCluster ) && null != jedisSentinelPool){
			 		jedisSentinelPool.returnBrokenResource(jedis);
			 }else{
			     if(null != jedisPool){
			         jedisPool.returnBrokenResource(jedis);
			     }
			  }
  • 3.0.0 以后
			Jedis jedis ;
 			#集群情况下使用哨兵集群
            JedisSentinelPool jedisSentinelPool = null;
            #单机使用JedisPool
            JedisPool jedisPool = null;
        	
        	#判断是否是集群
            if("true".equals(es_redis_isCluster)){
                jedisSentinelPool = RedisUtil.getJediSentinelPool(redis_isCluster,redis_cluster_name,redis_hostName, redis_port, redis_passWord,redis_database);
                jedis = jedisSentinelPool.getResource();
                jedis.select(Integer.parseInt(redis_database));

             }else{
                jedisPool = RedisUtil.getJedisPool(redis_cluster_name,redis_hostName, redis_port, redis_passWord,redis_database);
                jedis = jedisPool.getResource();
                jedis.select(Integer.parseInt(redis_database));

             }

			 if("true".equals(es_redis_isCluster ) && null != jedisSentinelPool){
                jedisSentinelPool.returnBrokenResource(jedis);
             }else{
               if(null != jedisPool){
                   jedis.close();
               }
             }
发布了150 篇原创文章 · 获赞 15 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/dymkkj/article/details/98959543
今日推荐