Jedis接続Redis高同時処理で接続数が下がらない

3299 ワード

に質問
  • 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();
                   }
                 }