Zusammenfassung der Erfahrungen mit der Redis-Optimierung

小云云
Freigeben: 2023-03-17 21:46:02
Original
2042 Leute haben es durchsucht

In Bezug auf die Optimierung der Speicherverwaltung gibt Ihnen dieser Artikel hauptsächlich eine Zusammenfassung der Erfahrungen mit der Redis-Optimierung, in der Hoffnung, allen zu helfen.

Redis Hash ist ein HashMap innerhalb des Werts. Wenn die Anzahl der Mitglieder der Map relativ klein ist, wird ein kompaktes Format ähnlich einem eindimensionalen linearen Format zum Speichern der Map verwendet, wodurch der Speicheraufwand entfällt eine große Anzahl von Zeigern. Dieses Parametersteuerelement entspricht den folgenden zwei Elementen in der Konfigurationsdatei redis.conf:

hash-max-zipmap-entries 64 hash-max-zipmap-value 512

Wenn der Wert den internen Wert dieser Karte nicht überschreitet und der Wert 64 Mitglieder enthält, wird er im linearen Kompaktformat gespeichert. Der Standardwert ist 64, dh wenn der Wert weniger als 64 Mitglieder enthält Wenn der Wert diesen Wert überschreitet, wird er automatisch in eine echte HashMap umgewandelt.

hash-max-zipmap-value bedeutet, dass linearer Kompaktspeicher verwendet wird, um Platz zu sparen, wenn die Länge jedes Mitgliedswerts in der Wertzuordnung eine bestimmte Anzahl von Bytes nicht überschreitet.

Wenn eine der beiden oben genannten Bedingungen den festgelegten Wert überschreitet, wird sie in eine echte HashMap umgewandelt, wodurch kein Speicher mehr gespart wird. Die Antwort lautet also: Je größer der Wert, desto besser Nein. Der Vorteil von HashMap besteht darin, dass die Zeitkomplexität von Suche und Betrieb O(1) ist. Wenn Sie auf Hash verzichten und einen eindimensionalen Speicher verwenden, beträgt die Zeitkomplexität O(n). 🎜> Mitglieder sind dann klein Die Auswirkungen sind nicht groß, da sie sonst die Leistung ernsthaft beeinträchtigen. Daher muss die Einstellung dieses Werts im Allgemeinen abgewogen werden. Dies ist der grundlegendste Kompromiss zwischen Zeitkosten und Platzkosten.

list-max-ziplist-value 64 list-max-ziplist-entries 512 

Die Knotenwertgröße des Listendatentyps ist kleiner als die Anzahl der Bytes. Es wird das kompakte Speicherformat Listendatentyp verwendet ist kleiner als die Anzahl der Knoten. Es wird ein kompaktes Speicherformat ohne Zeiger verwendet.

Speichervorabzuweisung:

Die interne Implementierung von Redis hat nicht viel zur Optimierung der Speicherzuweisung beigetragen (im Vergleich zu Memcache wird es bis zu einem gewissen Grad eine Speicherfragmentierung geben, aber in den meisten Fällen ist dies der Fall). Dies geschieht jedoch nicht zum Leistungsengpass von Redis. Wenn die meisten in Redis gespeicherten Daten jedoch numerisch sind, verwendet Redis intern eine gemeinsame Ganzzahl, um den Overhead für die Speicherzuweisung zu sparen Weist einen Wert von 1 bis n zu. Dann werden mehrere numerische Objekte in einen Pool gelegt. Wenn die gespeicherten Daten zufällig innerhalb dieses numerischen Bereichs liegen, wird das Objekt direkt aus dem Pool entnommen und durch Referenzzählung gemeinsam genutzt Die Werte werden im System gespeichert und können bis zu einem gewissen Grad die Leistung verbessern. Die Einstellung dieses Parameters erfordert die Änderung einer Zeile der Makrodefinition REDIS_SHARED_INTEGERS. Der Standardwert ist 10000 Ändern Sie es entsprechend Ihren eigenen Anforderungen.

Persistenzmechanismus:

Reguläre Snapshot-Methode (Snapshot):

Diese Persistenzmethode ist eigentlich ein Timer-Ereignis in Redis, das zu jedem festgelegten Zeitpunkt die aktuelle Situation überprüft Ob die Nummer und der Zeitpunkt der Datenänderungen erfüllen die konfigurierten Persistenz-Triggerbedingungen. Wenn dies der Fall ist, wird über den Fork-Aufruf des Betriebssystems ein untergeordneter Prozess erstellt, der standardmäßig denselben Adressraum mit dem übergeordneten Prozess teilt Der gesamte Speicher wird durch den untergeordneten Prozess durchlaufen, um Speichervorgänge auszuführen, während der Hauptprozess weiterhin Dienste bereitstellen kann. Bei einem Schreibvorgang führt das Betriebssystem eine Kopie beim Schreiben in Einheiten von Speicherseiten durch, um sicherzustellen, dass keine Verbindung besteht zwischen den übergeordneten und untergeordneten Prozessen beeinflussen sich gegenseitig.

Der Hauptnachteil dieser Persistenz besteht darin, dass der geplante Snapshot nur das Speicherabbild innerhalb eines bestimmten Zeitraums darstellt, sodass bei einem Systemneustart alle Daten zwischen dem letzten Snapshot und dem Neustart verloren gehen.

Anweisungsbasierte Anhängemethode (aof):

Die aof-Methode ähnelt tatsächlich der anweisungsbasierten Binlog-Methode von MySQL, das heißt, jeder Befehl, der Redis-Speicherdaten ändert, wird an a angehängt Protokolldatei, was bedeutet, dass diese Protokolldatei die persistenten Daten von Redis sind.

Der Hauptnachteil der aof-Methode besteht darin, dass das Anhängen der Protokolldatei zu groß werden kann. Wenn das System zum Wiederherstellen von Daten neu gestartet wird, kann das Laden der Daten mit der aof-Methode sehr langsam sein Das Laden von Dutzenden Gigabyte an Daten dauert mehrere Stunden. Dies liegt natürlich nicht daran, dass die Lesegeschwindigkeit der Festplattendatei langsam ist, sondern daran, dass alle gelesenen Befehle im Speicher ausgeführt werden müssen. Da für jeden Befehl ein Protokoll geschrieben werden muss, wird außerdem die Lese- und Schreibleistung von Redis bei Verwendung von aof verringert.

Sie können erwägen, Daten auf verschiedenen Redis-Instanzen zu speichern. Dadurch wird vermieden, dass Eier in einen Korb gelegt werden, was nicht nur die Auswirkungen von Cache-Fehlern auf das System verringern kann Dies kann die Datenwiederherstellung beschleunigen, bringt aber auch eine gewisse Komplexität in das Systemdesign mit sich.

Redis-Persistenz-Absturzproblem:

Personen mit Redis-Online-Betriebs- und Wartungserfahrung werden feststellen, dass Redis auftritt, wenn die physische Speichernutzung relativ groß ist, aber die tatsächliche gesamte physische Speicherkapazität nicht überschritten hat. Einige Leute glauben, dass das Problem der Instabilität oder sogar des Absturzes durch die Verdoppelung der Speichernutzung aufgrund des auf Snapshot-Persistenz basierenden Fork-Systemaufrufs verursacht wird. Diese Ansicht ist ungenau, da der Copy-on-Write-Mechanismus des Fork-Aufrufs darauf basiert In dieser Einheit werden also nur fehlerhafte Seiten kopiert, aber im Allgemeinen werden nicht alle Seiten in kurzer Zeit geschrieben, was zum Absturz von Redis führt.

Die Antwort ist, dass Redis-Persistenz Buffer IO verwendet. Das sogenannte Buffer IO bedeutet, dass Redis den physischen Speicher-Page-Cache für Schreib- und Lesevorgänge an persistenten Dateien verwendet, während die meisten Datenbanksysteme Direct IO verwenden, um diese Schicht zu umgehen Wenn die Redis-Persistenzdatei (insbesondere die Snapshot-Datei) zu groß ist, werden die Daten in der Festplattendatei beim Lesen und Schreiben in den physischen Speicher geladen Cache für die Datei im Betriebssystem, die Daten in dieser Cache-Schicht und die im Redis-Speicher verwalteten Daten werden tatsächlich wiederholt gespeichert. Obwohl der Kernel die Arbeit des Entfernens des Seitencaches übernimmt, wenn der physische Speicher knapp ist Wenn Sie der Meinung sind, dass ein bestimmter Seiten-Cache wichtiger ist, und Ihren Prozess Swap starten lassen, wird Ihr System instabil oder stürzt ab. Wir haben die Erfahrung gemacht, dass es gefährlicher wird, wenn die Nutzung Ihres physischen Redis-Speichers 3/5 der gesamten Speicherkapazität überschreitet.

Zusammenfassung:

1. Wählen Sie den geeigneten Datentyp entsprechend den Geschäftsanforderungen und legen Sie entsprechende kompakte Speicherparameter für verschiedene Anwendungsszenarien fest.

2. Wenn das Geschäftsszenario keine Datenpersistenz erfordert, kann das Ausschalten aller Persistenzmethoden die beste Leistung und maximale Speichernutzung erzielen.

3. Wenn Sie Persistenz verwenden müssen, wählen Sie zwischen der Snapshot-Methode und der Anweisungsanhänge-Methode, je nachdem, ob Sie den Verlust einiger Daten nach dem Neustart tolerieren können. Verwenden Sie keine virtuellen Speicher- und Diskstore-Methoden.

4. Lassen Sie nicht zu, dass die physische Speichernutzung Ihrer Redis-Maschine 3/5 des gesamten tatsächlichen Speichers überschreitet.

Die Option „maxmemory“ in redis.conf weist Redis an, nachfolgende Schreibanforderungen abzulehnen, sobald der physische Speicher verwendet wird. Dieser Parameter kann Ihren Redis gut vor der Verwendung schützen. Übermäßiger physischer Speicher führt zu Auslagerungen kann schließlich die Leistung ernsthaft beeinträchtigen oder sogar abstürzen.

VM-aktiviert in der redis.conf-Datei ist nein

Verwandte Empfehlungen:

Zusammenfassung der Verwendung der Redis-Funktion in PHP

Vollständige Aufzeichnung der Redis-Clusterkonstruktion

Zusammenfassung gängiger Methoden zum Betrieb von Redis in PHP

Das obige ist der detaillierte Inhalt vonZusammenfassung der Erfahrungen mit der Redis-Optimierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!