Hintergrund
Angemessene Einstellungen von Jedispool -Ressourcenpool -Parametern können die Verwendung von Redis für die geschäftliche Verwendung schützen. Dieser Artikel enthält eine detaillierte Erläuterung der Verwendung von Jedispool und der Parameter des Ressourcenpools und schließlich die "vernünftigste" Konfiguration.
1. wie man benutzt
Nehmen Sie den Beamten 2.9.0 als Beispiel (Jedis -Veröffentlichung) und hängt wie folgt ab:
<Depopenty> <gruppe> redis.clients </GroupId> <artifactId> jedis </artifactId> <version> 2.9.0 </Version> <Scope> kompilieren </scope> </abhängig>
Jedis verwendet Apache Commons-Pool2, um den Jedis-Ressourcenpool zu verwalten. Ein wichtiger Parameter bei der Definition von Jedispool ist der Ressourcenpool GenericObjectPoolConfig. Die Verwendung ist wie folgt, und es gibt viele Ressourcenverwaltungs- und Nutzungsparameter (siehe Abschnitt 2 für Einzelheiten)
Hinweis: Es wird später erwähnt, dass Jedispoolconfig anstelle von GenericObjectPoolConfig empfohlen wird
GenericObjectPoolConfig JedispoolConfig = New GenericObjectPoolConfig (); JedispoolConfig.SetMaxtotal (..); Jedispoolconfig.SetMaxidle (..); Jedispoolconfig.setminidle (..);
Die Initialisierung von Jedispool lautet wie folgt:
// Redishost und Redisport sind die IP und den Port des Instanzes // Redispassword ist das Passwort der Instanz // Timeout, die sowohl eine Verbindungszeitüberschreitung als auch eine Lesen- und Schreibzeitüberschreitung ist. Seit Jedis 2.8 gibt es einen Konstruktor, der ConnectionTimeout und Sotimeout unterscheidet. Jedispool Jedispool = New Jedispool (Jedispoolconfig, Redishost, Redisport, Timeout, Redispassword); Jedis jedis = null; try {jedis = jedispool.getResource (); // Spezifischer Befehl jedis.executeCommand ()} catch (Ausnahme E) {logger.Error (e.getMessage (), e);} schließlich {if (jedis! = Null) jedis.close (); // Beachten Sie, dass dies die Verbindung nicht schließt. Im Jedispool -Modus wird Jedis in den Ressourcenpool zurückgegeben. }2. Parameterbeschreibung
Jedispool stellt sicher, dass die Ressourcen in einem kontrollierbaren Bereich liegen und Gewindesicherheit bieten. Eine angemessene GenericObjectPoolConfig -Konfiguration kann jedoch Anwendungen mit REDIS schützen. Hier sind einige seiner wichtigen Parameter:
In der aktuellen Umgebung ist Jedis Connection eine Ressource und Jedispool verwaltet die Jedis -Verbindung.
1. Ressourceneinstellung und -nutzung
| Seriennummer | Parametername | Bedeutung | Standardwert | Empfehlungen für den Gebrauch |
|---|---|---|---|---|
| 1 | Maxtotal | Maximale Anzahl von Verbindungen im Ressourcenpool | 8 | Weitere Informationen finden Sie im nächsten Abschnitt zum Einrichten von Vorschlägen |
| 2 | Maxidle | Die maximale Anzahl von freien Verbindungen, die vom Ressourcenpool zulässig sind | 8 | Weitere Informationen finden Sie im nächsten Abschnitt zum Einrichten von Vorschlägen |
| 3 | Minidle | Der Ressourcenpool sorgt für die minimale Anzahl kostenloser Verbindungen | 0 | Weitere Informationen finden Sie im nächsten Abschnitt zum Einrichten von Vorschlägen |
| 4 | Blockwhenexhasted | Wenn der Ressourcenpool erschöpft ist, möchte der Anrufer warten. Erst wenn der folgende Maxwaitmillis in Kraft tritt | WAHR | Es wird empfohlen, Standardwerte zu verwenden |
| 5 | Maxwaitmillis | Wenn die Ressourcenbeckenverbindung erschöpft ist, ist die maximale Wartezeit des Anrufers (in Millisekunden) | -1: bedeutet, dass die Zeitüberschreitung niemals überschritten wird | Der Standardwert wird nicht empfohlen |
| 6 | testonborrow | Unabhängig davon | FALSCH | Wenn das Geschäftsvolumen groß ist, wird empfohlen, auf False (den Overhead of Ping wieder) einzustellen. |
| 7 | testonreturn | Unabhängig davon | FALSCH | Wenn das Geschäftsvolumen groß ist, wird empfohlen, auf False (den Overhead of Ping wieder) einzustellen. |
| 8 | JMxenabled | Unabhängig davon, ob die JMX -Überwachung aktiviert werden soll, kann sie zur Überwachung verwendet werden | WAHR | Es wird empfohlen, es zu aktivieren, aber die Anwendung selbst muss auch aktiviert sein. |
2. Überwachung von Leerlaufressourcen
Im Leerlauf -Jedis -Objekterkennung werden die folgenden vier Parameter kombiniert, um zu vervollständigen, und testen Sie, während der Schalter für diese Funktion ist.
| Seriennummer | Parametername | Bedeutung | Standardwert | Empfehlungen für den Gebrauch |
|---|---|---|---|---|
| 1 | Testen Sie während der IDLE | Ob Sie die Überwachung der Leerlaufressourcen aktivieren möchten | FALSCH | WAHR |
| 2 | TimeBetweenevictionRunsmillis | Erkennungszeit von Leerlaufressourcen (in Millisekunden) | -1: Keine Erkennung | Es wird empfohlen, die Einstellungen festzulegen, den Zyklus selbst auszuwählen, oder Sie können die Konfiguration standardmäßig in JedispoolConfig verwenden oder die folgende Konfiguration verwenden. |
| 3 | mineVictableIdletImemillis | Die minimale Leerlaufzeit von Ressourcen im Ressourcenpool (in Millisekunden). Nachdem dieser Wert erreicht ist, wird die Leerlaufressource entfernt. | 10006030 = 30 Minuten | Sie können sich basierend auf Ihrem eigenen Geschäft entscheiden, die meisten Standardwerte reichen aus, oder Sie können die folgende Konfiguration in Jeidspoolconfig verwenden |
| 4 | NumTestSperevictionrun | Bei der Erkennung von Leerlaufressourcen | 3 | Sie können entsprechend der Anzahl der von Ihnen aufgewendeten Verbindungen optimieren. Wenn Sie auf -1 eingestellt sind, führen Sie die Leerlaufüberwachung aller Verbindungen durch. |
Für den Einsatz der Verwendung bietet Jedis Jedispoolconfig, das selbst GenericObjectPoolConfig erbt und einige Einstellungen für die Leerlaufüberwachung festlegt.
Die öffentliche Klasse JedispoolConfig erweitert GenericObjectPoolConfig {public JedispoolConfig () {// Standardeinstellungen, um Ihr Leben mit dem Verbindungspool zu erleichtern :) Settly -Idle (wahr); // setMineVictableIdletImemillis (60000); // setTimeBetweenevictionRunsmillis (30000); setNumTestSperevictionRun (-1); }}Alle Standardwerte sind aus org.apache.commons.pool2.impl.baseObjectpoolconfig zu ersichtlich.
3..
1.Maxtotal: Maximale Anzahl von Verbindungen
Tatsächlich ist dies eine schwierige Frage, und es gibt viele Faktoren zu berücksichtigen:
Nehmen Sie ein Beispiel, um zu veranschaulichen, vorausgesetzt:
Dann beträgt die theoretisch erforderliche Ressourcenpool -Größe 50000 /1000 = 50. Tatsächlich ist dies jedoch ein theoretischer Wert, und es ist erforderlich zu berücksichtigen, dass einige Ressourcen reserviert werden müssen als der theoretische Wert. Im Allgemeinen kann Maxtotal größer sein als der theoretische Wert.
Aber je größer der Wert ist, desto besser. Einerseits ist die Verbindung zu viel, um Client- und Server -Ressourcen zu belegen. Andererseits ist es immer noch nutzlos, wenn Sie einen großen Ressourcenpool einrichten, wenn Server wie Redis mit hohen QPS ein großer Befehl eingerichtet sind.
2. Maxidle Minidle
Maxidle ist eigentlich die maximale Anzahl von Verbindungen, die vom Unternehmen gefordert werden. Maxtotal soll den Rand angeben, sodass Maxidle nicht zu klein eingestellt sein sollte, andernfalls wird es neue Jedis (neue Verbindung) Overhead geben, während Minidle die Überwachung der Leerlaufressourcen steuern soll.
Die beste Leistung des Verbindungspools ist maxtotal = maxidle, wodurch die durch die Skalierung von Verbindungspool verursachte Leistungsstörungen vermieden werden. Wenn die Parallelität jedoch nicht groß ist oder der Maxtotal zu hoch ist, führt dies zu unnötigen Verschwendung von Verbindungsressourcen.
Der von jedem Knoten verwendete Verbindungspool kann insgesamt basierend auf den tatsächlichen Gesamtoperationen und der Größe des aufrufenden Redis -Clients bewertet werden.
3. Überwachung
Der zuverlässigste Wert besteht darin, den "optimalen Wert" durch Überwachung zu erhalten. Sie können in Betracht ziehen, die Überwachung mit einigen Mitteln (z. B. JMX) implementieren, um vernünftige Werte zu finden.
4. Häufig gestellte Fragen
1. "Unzureichende" Ressourcen
redis.clients.jedis.exceptions.jedisconnectionException: konnte keine Ressource aus dem Pool bekommen… verursacht durch: java.util.nosuchelementException: Timeout wartet auf müßige objektat org.apache.commons.pool2.impl.genericobjectpool.borrowobject (genericobject.java.java:449).
oder
redis.clients.jedis.exceptions.jedisconnectionException: konnte keine Ressource aus dem Pool bekommen… verursacht durch: java.util.nosuchelementException: Pool erschasedat org.apache.commons.pool2.impl.genericobjectpool.borrowobject (Genericobjectpool.java:464)
Beide Fälle sind die Unfähigkeit, Ressourcen aus dem Ressourcenpool zu erhalten, aber der erste ist ein Auszeits, und der zweite liegt daran, dass Blockwhenexhusted falsch ist und überhaupt nicht gleich ist.
Denken Sie bei einer solchen Ausnahme nicht blind, dass der Ressourcenpool nicht groß genug ist. Der dritte Abschnitt wurde analysiert. Aus bestimmten Gründen können Sie überprüfen: Netzwerk, Parametereinstellungen für Ressourcenpools, Ressourcenpool -Überwachung (falls JMX überwacht wird), Code (z.
Weitere Informationen finden Sie in diesem Artikel: https://www.atatech.org/articles/77799
2. Jedispool vorheizen
Aus einigen Gründen (z. B. die Zeitlimiteinstellung ist gering) werden einige Projekte nach erfolgreichem Startup einzeitlich. Wenn Jedispool die maximale Anzahl von Ressourcen und die minimale Anzahl kostenloser Ressourcen definiert, wird die Jedis -Verbindung nicht wirklich in den Pool gebracht. Wenn es zum ersten Mal verwendet wird, hat der Pool keine Ressourcen, so dass es neue Jedis ist. Nach der Verwendung kann dies zu einem bestimmten Zeitraum über dem Kopf führen. Daher können Sie nach der Definition von Jedispool auch das Vorheizen für Jedispool im Voraus in Betracht ziehen, beispielsweise ist die minimale freie Zahl die Vorheizungsmenge.
Liste <Jedis> minidlejedislist = new ArrayList <Jedis> (jedispoolconfig.getminidle ()); für (int i = 0; i <jedispoolconfig.getminidle (); i ++) {jedis jedis = null; try {jedis = pool.getResource (); Minidlejedislist.add (Jedis); jedis.ping (); } catch (Ausnahme e) {logger.Error (e.getMessage (), e); } endlich {}} für (int i = 0; i <jedispoolconfig.getminidle (); i ++) {jedis jedis = null; try {jedis = minidlejedislist.get (i); jedis.close (); } catch (Ausnahme e) {logger.Error (e.getMessage (), e); } Endlich { }}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.