Dieser Artikel vermittelt Ihnen relevantes Wissen über Redis. Er stellt hauptsächlich die damit verbundenen Probleme zur Optimierung von Redis vor, wenn der Speicher voll ist. Er enthält auch den Eliminierungsmechanismus, den LRU-Algorithmus und die Verarbeitung eliminierter Daten an alle. Hilfreich.
Empfohlenes Lernen: Redis-Lerntutorial
Wenn die Größe des Redis-Speicherdatensatzes auf eine bestimmte Größe ansteigt, werden Daten gespeichert Eliminierungsstrategie wird umgesetzt.
Speicher.
Wenn die festgelegte Obergrenze erreicht ist, gibt der Redis-Schreibbefehl eine Fehlermeldung zurück (der Lesebefehl kann jedoch weiterhin normal zurückgegeben werden). Oder Sie können den Speichereliminierungsmechanismus konfigurieren und den alten Speicherlöschungsmechanismus konfigurieren, wenn Redis die obere Speichergrenze erreicht Der Inhalt wird gelöscht.
Was sind die Eliminierungsstrategien für den Redis-Cache?
Es gibt 7 Eliminierungsstrategien. Wir können sie basierend auf dem Umfang der Eliminierungskandidatendatensätze weiter in zwei Kategorien einteilen:
Strategie | Regeln |
---|---|
volatile-ttl | Beim Filtern werden Schlüssel-Wert-Paare mit festgelegter Ablaufzeit entsprechend der Reihenfolge der Ablaufzeit gelöscht früher wurde gelöscht. |
volatile-random | Schlüssel-Wert-Paare nach dem Zufallsprinzip mit festgelegter Ablaufzeit löschen. -Volatile-lru |
allkeys-lru | Verwenden Sie den LRU-Algorithmus, um alle Daten zu filtern |
vallkeys -lfu | Verwenden Sie den LFU-Algorithmus, um alle Daten zu filtern |
, der Daten nach dem Prinzip der am wenigsten verwendeten Daten filtert. Die am seltensten verwendeten Daten werden herausgefiltert, während die zuletzt häufig verwendeten Daten im Cache verbleiben.
Wie genau werden Sie dann untersucht? LRU organisiert alle Daten in einer verknüpften Liste. Der Kopf und das Ende der verknüpften Liste stellen das MRU-Ende bzw. das LRU-Ende dar und stellen die zuletzt verwendeten Daten und die zuletzt am seltensten verwendeten Daten dar.
Die Idee hinter dem LRU-Algorithmus ist sehr einfach: Er geht davon aus, dass auf die Daten, auf die gerade zugegriffen wurde, definitiv erneut zugegriffen wird, und platziert sie daher auf der MRU-Seite Es kann nicht mehr darauf zugegriffen werden. Lassen Sie es also nach und nach auf die LRU-Seite zurückwandern und löschen Sie es zuerst, wenn der Cache voll ist.
Problem: Wenn der LRU-Algorithmus tatsächlich implementiert wird, muss er eine verknüpfte Liste verwenden, um alle zwischengespeicherten Daten zu verwalten, was zusätzlichen Speicherplatzaufwand mit sich bringt. Darüber hinaus müssen beim Zugriff auf Daten die Daten in die MRU in der verknüpften Liste verschoben werden. Wenn auf eine große Datenmenge zugegriffen wird, werden viele Verschiebevorgänge für verknüpfte Listen durchgeführt, was sehr zeitaufwändig ist und die Leistung des Redis-Cache verringert .
Lösung:
In Redis wurde der LRU-Algorithmus vereinfacht, um die Auswirkungen der Datenbeseitigung auf die Cache-Leistung zu reduzieren. Insbesondere zeichnet Redis standardmäßig den aktuellsten Zugriffszeitstempel aller Daten auf (aufgezeichnet durch das LRU-Feld in der Schlüssel-Wert-Paar-Datenstruktur RedisObject). Wenn Redis dann die zu eliminierenden Daten bestimmt, wählt es zum ersten Mal zufällig N Daten aus und verwendet sie als Kandidatensatz. Als nächstes vergleicht Redis die LRU-Felder dieser N Daten und entfernt die Daten mit dem kleinsten LRU-Feldwert aus dem Cache.
Wenn Daten erneut eliminiert werden müssen, muss Redis die Daten in den Kandidatensatz aufnehmen, der bei der ersten Eliminierung erstellt wurde. Das Auswahlkriterium lautet hier: Der LRU-Feldwert der Daten, die in den Kandidatensatz eingegeben werden können, muss kleiner sein als der kleinste LRU-Wert im Kandidatensatz. Wenn neue Daten in den Kandidatendatensatz eingegeben werden und die Anzahl der Daten im Kandidatendatensatz maxmemory-samples erreicht, entfernt Redis die Daten mit dem kleinsten LRU-Feldwert im Kandidatendatensatz.
Verwendungsvorschläge:
Sobald die gelöschten Daten ausgewählt sind und es sich um saubere Daten handelt, werden wir sie direkt löschen. Wenn es sich bei den Daten um schmutzige Daten handelt, müssen wir sie zurück in die Datenbank schreiben.
Wie kann man also beurteilen, ob ein Datenelement sauber oder schmutzig ist?
Auch wenn es sich bei den gelöschten Daten um schmutzige Daten handelt, schreibt Redis sie nicht zurück in die Datenbank. Wenn wir also den Redis-Cache verwenden und die Daten geändert werden, müssen sie bei der Änderung der Daten in die Datenbank zurückgeschrieben werden. Andernfalls werden die verschmutzten Daten bei der Beseitigung von Redis gelöscht und die Datenbank enthält keine aktuellen Daten mehr.
1. Kontrollieren Sie die Anzahl der Schlüssel: Wenn Sie Redis zum Speichern großer Datenmengen verwenden, gibt es normalerweise eine große Anzahl von Schlüsseln, und zu viele Schlüssel verbrauchen auch viel Speicher. Redis ist im Wesentlichen ein Datenstrukturserver, der uns eine Vielzahl von Datenstrukturen wie Hash, Liste, Set, Zset und andere Strukturen bereitstellt. Vermeiden Sie Missverständnisse bei der Verwendung von Redis, verwenden Sie APIs wie get/set ausgiebig und verwenden Sie Redis als Memcached. Um denselben Dateninhalt zu speichern, kann die Verwendung der Redis-Datenstruktur zur Reduzierung der Anzahl äußerer Schlüssel auch viel Speicher sparen.
2. Schlüsselwertobjekte reduzieren Der direkteste Weg, die Redis-Speichernutzung zu reduzieren, besteht darin, die Länge von Schlüsseln und Werten zu reduzieren.
3. Codierungsoptimierung. Redis stellt externe Typen wie String, Liste, Hash, Set, Zet usw. bereit, aber Redis verfügt intern über das Konzept der Codierung für verschiedene Typen. Die sogenannte Codierung bezieht sich auf die spezifische zugrunde liegende Datenstruktur, die für die Implementierung verwendet wird. Unterschiedliche Kodierungen wirken sich direkt auf die Speichernutzung sowie die Lese- und Schreibeffizienz der Daten aus.
Typfeld:
Verwenden Sie Sammlungstypdaten, da normalerweise viele kleine Schlüsselwerte kompakter zusammen gespeichert werden können. Verwenden Sie so viele Hashes wie möglich (d. h. die in einer Hash-Tabelle gespeicherte Anzahl ist gering) und beanspruchen sehr wenig Speicher. Daher sollten Sie Ihr Datenmodell so weit wie möglich in eine Hash-Tabelle abstrahieren. Wenn in Ihrem Websystem beispielsweise ein Benutzerobjekt vorhanden ist, legen Sie keinen separaten Schlüssel für den Namen, den Nachnamen, die E-Mail-Adresse und das Passwort des Benutzers fest. Speichern Sie stattdessen alle Informationen des Benutzers in einer Hash-Tabelle.
Encoding-Feld:
Es gibt offensichtliche Unterschiede in der Speichernutzung bei Verwendung unterschiedlicher Codierungen
LRU-Feld:
Entwicklungstipp: Sie können den Befehl scan + object emptytime verwenden, um stapelweise abzufragen, auf welche Schlüssel nicht zugegriffen wurde Suchen Sie nach Schlüsseln, auf die längere Zeit nicht zugegriffen wurde, um die Speichernutzung zu reduzieren.
Refcount-Feld:
Wenn das Objekt eine Ganzzahl ist und der Bereich [0-9999] beträgt, kann Redis gemeinsam genutzte Objekte verwenden, um Speicher zu sparen.
ptr-Feld :
Entwicklungstipp: In Szenarien mit hohem gleichzeitigem Schreiben wird empfohlen, die Zeichenfolgenlänge auf 39 Byte zu beschränken, sofern die Bedingungen dies zulassen, um die Anzahl der Speicherzuweisungen zum Erstellen von redisObject zu reduzieren und die Leistung zu verbessern.
Warum ist der Objektpool ungültig, nachdem Maxmemory und die LRU-Eliminierungsstrategie aktiviert wurden? Der LRU-Algorithmus muss die letzte Zugriffszeit des Objekts ermitteln, um die längste nicht besuchte Daten jedes Objekts zu entfernen wird im lru-Feld des redisObject-Objekts gespeichert. Objektfreigabe bedeutet, dass mehrere Referenzen dasselbe redisObject gemeinsam nutzen. Zu diesem Zeitpunkt wird auch das LRU-Feld gemeinsam genutzt, sodass es unmöglich ist, die letzte Zugriffszeit jedes Objekts zu ermitteln. Wenn maxmemory nicht festgelegt ist, löst Redis das Speicherrecycling erst aus, wenn der Speicher erschöpft ist, sodass der gemeinsam genutzte Objektpool normal funktionieren kann.
Zusammenfassend lässt sich sagen, dass der Shared Object Pool mit der Maxmemory + LRU-Strategie in Konflikt steht, sodass Sie bei der Verwendung vorsichtig sein müssen.
Warum nur Integer-Objektpool? Erstens hat der Integer-Objektpool die höchste Wiederverwendungswahrscheinlichkeit. Zweitens besteht eine Schlüsseloperation der Objektfreigabe darin, die Gleichheit zu beurteilen. Der Grund, warum Redis nur einen Integer-Objektpool hat, liegt in der zeitlichen Komplexität des Integer-Vergleichsalgorithmus O(1) und nur 10.000 werden ganzzahlig beibehalten, um Objektpoolverschwendung zu vermeiden. Wenn die Gleichheit der Zeichenfolgen beurteilt wird, wird die Zeitkomplexität zu O(n), insbesondere lange Zeichenfolgen verbrauchen mehr Leistung (Gleitkommazahlen werden intern in Redis mithilfe von Zeichenfolgen gespeichert). Für komplexere Datenstrukturen wie Hash, Liste usw. erfordert die Gleichheitsbeurteilung O(n2). Für Single-Threaded-Redis ist ein solcher Overhead offensichtlich unangemessen, sodass Redis nur einen ganzzahligen gemeinsam genutzten Objektpool behält.
String-Struktur:
Vorabzuteilungsmechanismus:
String-Rekonstruktion: Eine sekundäre Codierungsmethode basierend auf dem Hash-Typ.
Wenn Redis nicht mehr über genügend Speicher verfügt, besteht die erste Überlegung darin, keine Maschinen für die horizontale Erweiterung hinzuzufügen. Versuchen Sie zunächst, den Speicher zu optimieren. Wenn Sie auf einen Engpass stoßen, denken Sie über eine horizontale Erweiterung nach. Auch bei Clustering-Lösungen ist die Optimierung auf vertikaler Ebene gleichermaßen wichtig, um unnötige Ressourcenverschwendung und Verwaltungskosten nach dem Clustering zu vermeiden.
Empfohlenes Lernen: Redis-Tutorial
Das obige ist der detaillierte Inhalt vonDetaillierte Analyse zur Optimierung von Redis, wenn der Speicher voll ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!