Bei der Verwendung von Jedispool zur Verbindung zu Redis verwenden die Java -Seite häufig Deadlocks während hoher Parallelität oder meldet Verbindungsausnahmen, JedisconnectionException oder GetResource -Ausnahmen und andere Probleme.
Zwei Dinge zu beachten, wenn Jedispool verwendet wird
1. Fügen Sie die Thread -Synchronisation hinzu, wenn Sie Jedispool und Jedis erhalten, um sicherzustellen, dass Sie nicht zu viele Jedispool und Jedis erstellen.
2. Nachdem Sie die Jedis -Instanz verwendet haben, müssen Sie sie an Jedispool zurückgeben.
Ich habe die Redis -Werkzeugklasse ausgeklärt, die viele Tests und hohe Parallelitätstests bestand.
Paket com.caspar.util; import Java.util.concurrent.locks.reentrantlock; import org.apache.log4j.logger; Import redis.clients.jedis.jedis; import redis.clients.jedis.jedispool; import redis.clients.jedis.jedispool; import redis.clients.jedis.jedispoolconfig; / ** * Redis -Werkzeugklasse * @Author Caspar * */ öffentliche Klasse Redisutil {Protected Static Reentrantlock lockpool = new Reentrantlock (); geschütztes statisches Reentrantlock lockjedis = neuer Reentrantlock (); geschützter statischer logger logger = logger.getLogger (redisutil.class); // redis server ip private statische String addr_array = fileutil.getPropertyValue ("/properties/redis.properties", "server"); // Redis -Portnummer private statische int port = fileUtil.getPropertyValueInt ("/properties/redis.properties", "port"); // Zugriff auf Passwort // private statische String auth = fileutil.getPropertyValue ("/properties/redis.properties", "auth"); // Die maximale Anzahl der verfügbaren Verbindungsinstanzen beträgt der Standardwert 8; // Wenn der Wert -1 ist, bedeutet dies keine Grenze; Wenn der Pool bereits maxaktive Jedis -Instanzen zugewiesen hat, ist der Status des Pools zu diesem Zeitpunkt erschöpft (erschöpft). private static int max_active = fileutil.getPropertyValueInt ("/properties/redis.properties", "max_active"); // Kontakte Wie viele Jedis -Instanzen mit Zustand im Leerlauf (Leerlauf) in einem Pool beträgt der Standardwert auch 8. Private statische int max_idle = fileUtil.getPropertyValueInt ("/properties/redis.properties", "max_idle") ;; // Die maximale Zeit, um auf verfügbare Verbindungen in Millisekunden zu warten, beträgt der Standardwert -1, was darauf hinweist, dass das Timeout niemals erreicht wird. Wenn die Wartezeit überschritten wird, wird eine JedisconnectionException direkt geworfen. private static int max_wait = fileutil.getPropertyValueInt ("/properties/redis.properties", "max_wait"); // Zeitüberschreitungszeit private statische int timeout = fileutil.getPropertyValueInt ("/properties/redis.properties", "timeout"); // beim Ausleihen einer Jedis -Instanz, ob Sie im Voraus validieren sollen; Wenn wahr, ist die erhaltene Jedis -Instanz verfügbar; private static boolean test_on_borrow = fileUtil.getPropertyValueboolean ("/properties/redis.properties", "test_on_borrow") ;; privates statisches Jedispool Jedispool = NULL; / ***Redis -Ablaufzeit in Sekunden*/ öffentliches endgültiges statisches int exrp_hour = 60*60; // eine Stunde öffentliche endgültige statische statische int exrp_day = 60*60*24; // One Day Public Final static int exrp_month = 60*60*24*30; // einen Monat/*** Redis -Verbindungspool initialisieren*/private statische void initialpool () {try {jedispoolconfig config = new JedispoolConfig (); config.setMaxtotal (max_active); config.setMaxIdle (max_idle); config.setMaxwaitmillis (max_wait); config.settestonBorrow (test_on_borrow); jedispool = new Jedispool (config, addr_array.split (",") [0], port, timeout); } catch (Ausnahme e) {logger.Error ("Erstellen Sie zuerst Jedispool -Fehler:"+e); Versuchen Sie {// Wenn die erste IP außergewöhnlich ist, greifen Sie auf die zweite IP JedispoolConfig config = new JedispoolConfig () zu; config.setMaxtotal (max_active); config.setMaxIdle (max_idle); config.setMaxwaitmillis (max_wait); config.settestonBorrow (test_on_borrow); jedispool = new Jedispool (config, addr_array.split (",") [1], port, timeout); } catch (Ausnahme e2) {logger.Error ("zweiten erstellen Jedispool -Fehler:"+e2); }}} /*** Synchronische Initialisierung in einer multi-thread-Umgebung* /privates statisches void poolinit () {// Behauptet, ob die aktuelle Sperre gesperrt wurde, falls sie gesperrt ist, tun Sie nichts. Wenn es keine Schloss gibt, führen Sie die folgenden Schritte aus! lockpool.isheldbycurrentThread (); lockpool.lock (); try {if (jedispool == null) {initialpool (); }} catch (Ausnahme e) {e.printstacktrace (); } endlich {lockpool.unlock (); }} public static jedis getJedis () {// Behauptet, ob das aktuelle Schloss gesperrt wurde, wenn es gesperrt ist, tun Sie nichts. Wenn es keine Schloss gibt, führen Sie die folgenden Schritte aus! lockjedis.isheldbycurrentThread (); lockjedis.lock (); if (jedispool == null) {poolinit (); } Jedis jedis = null; try {if (jedispool! = null) {jedis = jedispool.getResource (); }} catch (Ausnahme e) {logger.Error ("Jedis -Fehler erhalten:"+e); } endlich {returnResource (jedis); lockjedis.unlock (); } return jedis; } / *** veröffentlichen Jedis Resources* @param jedis* / public static void returnResource (letztes Jedis jedis) {if (jedis! = Null && jedispool! = Null) {jedispool.returnResource (Jedis); }} / ** * Setzen Sie String * @param Key * @param value * / public synchronisierte statische void setString (String -Taste, String -Wert) {try {value = stringutil.isempty (value)? "" : Wert; getJedis (). set (Schlüssel, Wert); } catch (Ausnahme e) {logger.Error ("Schlüsselfehler festlegen:"+e); }} / *** Setzen Sie die Ablaufzeit* @param key* @param Sekunden in Sekunden* @param value* / public synchronisiertes statisches void setString (String -Schlüssel, int Sekunden, String -Wert) {try {value = stringutil.isempty (value)? "" : Wert; getJedis (). setEx (Schlüssel, Sekunden, Wert); } catch (Ausnahme e) {logger.Error ("keyEx -Fehler setzen:"+e); }} / ** * String -Wert erhalten * @param key * @return value * / public synchronisierte statische String getString (String -Schlüssel) {if (getJedis () == null ||! GetJedis (). Existiert (Schlüssel) {return null; } return getJedis (). Get (Schlüssel); }}Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.