Redis erfreut sich in der aktuellen Technologie-Community großer Beliebtheit. Redis hat von einem kleinen persönlichen Projekt von Antirez einen langen Weg zurückgelegt und ist zum Industriestandard für die In-Memory-Datenspeicherung geworden. Die daraus resultierenden Best Practices ermöglichen es den meisten Menschen, Redis korrekt zu verwenden.
1. Hören Sie auf, SCHLÜSSEL * zu verwenden
Okay, diesen Artikel mit der Infragestellung dieses Befehls zu beginnen, ist vielleicht kein guter Weg, aber es ist tatsächlich möglich wichtigster Punkt. Wenn wir auf die Statistiken einer Redis-Instanz achten, geben wir oft schnell den Befehl „KEYS *“ ein, damit die Schlüsselinformationen klar angezeigt werden.
Aus Programmiersicht neigen wir dazu, Pseudocode wie den folgenden zu schreiben:
for key in'keys *': doAllTheThings()
Aber wenn Sie 13 Millionen Schlüssel haben, wird die Ausführungsgeschwindigkeit langsamer. Da die zeitliche Komplexität des Befehls KEYS O(n) beträgt, wobei n die Anzahl der zurückzugebenden Schlüssel ist, hängt die Komplexität dieses Befehls von der Größe der Datenbank ab. Und während der Ausführung dieses Vorgangs können in Ihrer Instanz keine anderen Befehle ausgeführt werden.
Als alternativen Befehl sehen Sie sich SCAN an, der Ihnen eine benutzerfreundlichere Vorgehensweise ermöglicht ... SCAN scannt die Datenbank in einer inkrementellen Iteration. Dieser Vorgang wird basierend auf dem Iterator des Cursors ausgeführt, sodass Sie jederzeit nach Belieben anhalten oder fortfahren können.
2. Finden Sie den Übeltäter heraus, der Redis verlangsamt
Da Redis nicht über sehr detaillierte Protokolle verfügt, ist es sehr schwierig zu wissen, was in der Redis-Instanz geschieht. Glücklicherweise bietet Redis ein Befehlsstatistiktool wie das folgende:
127.0.0.1:6379> INFO commandstats # Commandstats cmdstat_get:calls=78,usec=608,usec_per_call=7.79 cmdstat_setex:calls=5,usec=71,usec_per_call=14.20 cmdstat_keys:calls=2,usec=42,usec_per_call=21.00 cmdstat_info:calls=10,usec=1931,usec_per_call=193.10
Mit diesem Tool können Sie Schnappschüsse aller Befehlsstatistiken anzeigen, z. B. wie oft der Befehl ausgeführt wurde und wie viele Millisekunden er dafür benötigt hat Führen Sie den Befehl aus (jeder Befehl gibt die Gesamtzeit und die durchschnittliche Zeit an)
Sie müssen lediglich den Befehl CONFIG RESETSTAT ausführen, um ihn zurückzusetzen, damit Sie ein brandneues statistisches Ergebnis erhalten.
3. Nutzen Sie die Redis-Benchmark-Ergebnisse als Referenz, anstatt sie zu verallgemeinern
Salvatore, der Vater von Redis, sagte: „Das Testen von Redis durch die Ausführung von GET/SET-Befehlen ist wie das Testen eines Ferrari.“ Ein regnerischer Tag. Die Wirkung eines Scheibenwischers, der einen Spiegel reinigt. Oft kommen Leute zu mir und wollen wissen, warum ihre Redis-Benchmark-Statistiken niedriger sind als die optimalen Ergebnisse. Aber wir müssen verschiedene reale Situationen berücksichtigen.
Zum Beispiel:
Welche Einschränkungen der Client-Betriebsumgebung kann es geben? Sind
dieselbe Versionsnummer?
Steht die Leistung in der Testumgebung im Einklang mit der Umgebung, in der die Anwendung ausgeführt wird?
Die Testergebnisse von Redis-Benchmark stellen einen Benchmark-Punkt dar, um sicherzustellen, dass Ihr Redis-Server nicht in einem abnormalen Zustand läuft, aber Sie sollten es niemals als echten „Stresstest“ betrachten “. Stresstests müssen widerspiegeln, wie die Anwendung ausgeführt wird, und benötigen eine Umgebung, die der Produktion möglichst ähnlich ist.
4. Hashes ist Ihre beste Wahl
Führen Sie Hashes auf elegante Weise ein. Hashes werden Ihnen ein beispielloses Erlebnis bescheren. Ich habe schon viele Schlüsselstrukturen gesehen, die den folgenden ähneln:
foo:first_name foo:last_name foo:address
Im obigen Beispiel kann foo der Benutzername eines Benutzers sein und jedes darin enthaltene Element ist ein separater Schlüssel. Dies erhöht den Spielraum für Fehler und unnötige Schlüssel. Verwenden Sie stattdessen Hash. Sie werden überrascht sein, dass Sie nur einen Schlüssel benötigen:
127.0.0.1:6379> HSET foo first_name 'Joe' (integer) 1 127.0.0.1:6379> HSET foo last_name 'Engel' (integer) 1 127.0.0.1:6379> HSET foo address '1 Fanatical Pl' (integer) 1 127.0.0.1:6379> HGETALL foo 1) 'first_name' 2) 'Joe' 3) 'last_name' 4) 'Engel' 5) 'address' 6) '1 Fanatical Pl' 127.0.0.1:6379> HGET foo first_name 'Joe'
5. Legen Sie die Überlebenszeit des Schlüsselwerts fest.
Nutzen Sie nach Möglichkeit das Schlüssel-Timeout. Ein gutes Beispiel ist die Speicherung so etwas wie eines temporären Authentifizierungsschlüssels. Wenn Sie nach einem Autorisierungsschlüssel suchen – nehmen Sie OAUTH als Beispiel – erhalten Sie normalerweise eine Zeitüberschreitung.
Stellen Sie auf diese Weise beim Festlegen des Schlüssels den gleichen Timeout-Zeitraum ein, und Redis löscht ihn automatisch für Sie! Es ist nicht mehr erforderlich, KEYS * zu verwenden, um alle Tasten zu durchlaufen.
6. Wählen Sie eine geeignete Recyclingstrategie
Nachdem wir nun über das Löschen von Schlüsseln gesprochen haben, sprechen wir über Recyclingstrategien. Wenn der Speicherplatz der Redis-Instanz voll ist, wird versucht, einige Schlüssel zurückzugewinnen. Abhängig von Ihrer Nutzung empfehle ich dringend die Verwendung der volatile-lru-Strategie – vorausgesetzt, Sie haben ein Timeout für den Schlüssel festgelegt.
Aber wenn Sie etwas Ähnliches wie den Cache ausführen und keinen Timeout-Mechanismus für Schlüssel festlegen, können Sie die Verwendung des allkeys-lru-Recyclingmechanismus in Betracht ziehen.
7. Wenn Ihre Daten wichtig sind, verwenden Sie bitte Try/Except
Wenn Sie sicherstellen müssen, dass kritische Daten in eine Redis-Instanz eingefügt werden können, empfehle ich dringend, sie in einen Try/Except einzufügen. außer Block. Da nahezu alle Redis-Clients die Strategie „Senden und Vergessen“ anwenden, muss häufig geprüft werden, ob ein Schlüssel tatsächlich in der Redis-Datenbank abgelegt wird.
Was die Komplexität des Einfügens von try/expect in den Redis-Befehl angeht, geht es in diesem Artikel nicht darum. Sie müssen nur wissen, dass dadurch sichergestellt werden kann, dass wichtige Daten dort platziert werden, wo sie sein sollten.
8. Eine Instanz nicht erschöpfen
Wenn möglich, verteilen Sie die Arbeitslast auf mehrere Redis-Instanzen. Ab Version 3.0.0 unterstützt Redis Cluster. Mit Redis Cluster können Sie einige Schlüssel, die Master/Slave-Modi enthalten, basierend auf Schlüsselbereichen heraustrennen. Die komplette „Magie“ hinter Clustering finden Sie hier.
Aber wenn Sie nach Tutorials suchen, dann ist dies der perfekte Ort. Wenn Clustering keine Option ist, ziehen Sie Namespaces in Betracht und verteilen Sie Ihre Schlüssel auf mehrere Instanzen.
9. Sind mehr Kerne besser? !
Natürlich ist es falsch. Redis ist ein Single-Threaded-Prozess und verbraucht selbst bei aktivierter Persistenz nur maximal zwei Kerne. Es sei denn, Sie planen, mehrere Instanzen auf einem einzigen Host auszuführen – hoffentlich nur in einer Entwicklungs- und Testumgebung! ——Ansonsten sind nicht mehr als 2 Kerne für eine Redis-Instanz erforderlich.
10. Hohe Verfügbarkeit
Bisher wurde Redis Sentinel gründlich getestet und von vielen Benutzern in Produktionsumgebungen angewendet (einschließlich ObjectRocket). Wenn Ihre Anwendung stark auf Redis angewiesen ist, müssen Sie eine Hochverfügbarkeitslösung entwickeln, um sicherzustellen, dass sie nicht offline geht.
Weitere Informationen zu diesem Thema finden Sie in der Spalte Java Basic Tutorial
Das obige ist der detaillierte Inhalt von10 Tipps zur Redis-Nutzung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!