2017-06-27 1 views
1

Ich benutze Jedis, um mit Redis-Server zu verbinden. Redis ip-Wert wird in einer separaten Datei konfiguriert und ich versuche, die Datei während der InitialisierungThreads waren im Wartezustand, während eine Ressource von JedisPool

private static JedisPool pool; 

public static void initRedisClient() throws Exception { 
    String redisConfigPath = "/conf/redis.properties"; 
    Properties docsRedisProp = RedisUtils.loadProperties(redisConfigPath); 
    pool = new JedisPool(docsRedisProp.getProperty("redisserver"));  
    } 
} 

Und meine mget Methode zu laden mehrere Schlüssel zu holen von redis sind wie folgt

public static List<String> mgetDataFromRedisCache(String[] keys) throws CacheException { 
     Jedis jedisCon = null; 
     try { 
      jedisCon = getJedis(); 
      jedisCon.select(1); 
      return jedisCon.mget(keys); 
     } catch (Exception e) { 
      LOGGER.warning("Exception while fetching data from Redis Client. EXCEPTION=" + e.getMessage()); 
      e.printStackTrace(); 
     } finally { 
      if (jedisCon != null) { 
       returnJedis(jedisCon); 
      } 
     } 
     return null; 
    } 

Wenn ich In der Eigenschaftendatei wurde ein falscher IP-Wert angegeben - der auf ihn zugreifende Anfrage-Thread wartet für längere Zeit. Meine Anfrage sollte aufgrund der Nichtverfügbarkeit der Ressource im Pool nicht blockiert werden.

Hier bin ich Anbringen der Thread-Dump blockierter Threads (dh, Threads, die in Wartezustand waren)

###_http-nio-8443-exec-140" #104908 daemon prio=5 os_prio=0 tid=0x00007f247805f000 nid=0x4266 waiting on condition [0x00007f220a4df000] 
    java.lang.Thread.State: WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x00000006fe438408> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
    at org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:524) 
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:438) 
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:361) 
    at redis.clients.util.Pool.getResource(Pool.java:40) 
    at redis.clients.jedis.JedisPool.getResource(JedisPool.java:84) 
    at com.retail.store.RedisClient.getJedis(RedisClient.java:53) 
    at com.retail.store.RedisClient.mgetDataFromRedisCache(RedisClient.java:82) 

Wie konnte ich das erreichen? Jede Hilfe wird sehr geschätzt. Vielen Dank im Voraus :-)

+0

Haben Sie etwas zu diesem Thema erfahren? Wir haben das gleiche Problem, wenn wir redis mit spring-data-redisis verwenden (aber auch Jedis als Client) – woezelmann

+0

@woezelmann setting 'setMaxWaitMillis' hat mir geholfen. Habe mir das in meiner Antwort erklärt. Bitte schauen Sie hinein. ich hoffe es hilft !! – Natasha

Antwort

0

Sie können Jedis-Verbindung mit einem kurzen Timeout erstellen, mit der entsprechenden constructor.

+0

10 Ich denke, der Standardwert für die Zeitüberschreitung ist 2000 Millisekunden. Das ist 2 Sekunden ... – Natasha

+0

Wird diese 2 Sekunden verursachen einen Thread in App-Servern angehalten werden? – Natasha

+0

Wenn es zu viele Anfragen gibt, die den App-Server treffen - verursacht das 2s eine große Auswirkung - so dass die anfordernden Threads blockiert werden? – Natasha

1

Die IP-Adresse des Redis-Servers wird in einer Eigenschaftendatei verwaltet und zur Laufzeit geladen.

Die Eigenschaftendatei enthält Standard-IP. Aber wenn ich das selbe in meinem Entwicklungssetup einsetze, hätte die redis ip geändert werden sollen, aber ich habe es versäumt. Mein Entwicklungssetup konnte keine Verbindung mit der angegebenen IP herstellen.

Jedis hat die folgenden Standardkonfigurationen

maximimum aktive Verbindungen = 8

Readtimeout = 2000

Maximum active connections ist die maximale Anzahl von aktiven Verbindungen der Pool gleichzeitig aufnehmen kann.

read time out ist die maximale Zeit in Millisekunden, die eingestellt wird, wenn die Verbindungen hergestellt werden und bereit ist, Daten über die hergestellte Verbindung zu empfangen.

In unserem Fall ist die Verbindung nicht hergestellt (für die ersten 8 Threads) und es ist nie getötet - die Verbindung ist Timeout ist nicht für diese Verbindungen eingestellt. Die anderen Threads, die get Aufruf zu Redis macht, geht jetzt in den Park WAIT State.

Durch die folgenden Pool-Konfigurationen einstellen (das heißt, Einstellung maximale Wartezeit die Verbindungen für den Aufbau) wir die Fäden gehen verlängerten Wartezustand vermeiden

JedisPoolConfig jedisConfig = new JedisPoolConfig(); 
jedisConfig.setMaxWaitMillis(maxWaitInMillis); 
Verwandte Themen