Heim  >  Artikel  >  Datenbank  >  Wie Redis Speicher spart

Wie Redis Speicher spart

王林
王林nach vorne
2023-05-31 20:04:15620Durchsuche

Zuallererst hat diese Anwendung, die die Benutzer-UID anhand der Bild-ID überprüft, die folgenden Anforderungen:

  • Die Abfragegeschwindigkeit muss schnell genug sein

  • Alle Daten müssen im Speicher abgelegt werden, vorzugsweise ein EC2-High-The Das Speichermodell kann es speichern (17 GB oder 34 GB, 68 GB sind zu verschwenderisch)

  • Unterstützt Persistenz, sodass nach dem Neustart des Servers kein Aufwärmen erforderlich ist

Zunächst lehnten sie die Datenbankspeicherlösung ab und Sie haben das KISS-Prinzip (Keep It Simple and Stupid) übernommen, da diese Anwendung die Aktualisierungsfunktion, Transaktionsfunktion, zugehörige Abfrage und andere großartige Funktionen der Datenbank überhaupt nicht verwendet, sodass keine Notwendigkeit besteht, eine auszuwählen und zu verwalten Datenbank für diese ungenutzten Funktionen.

Also haben sie sich für Redis entschieden, eine In-Memory-Datenbank, die Persistenz unterstützt (VM vergessen), und die einfachste Implementierung besteht darin, die String-Struktur von Redis zu verwenden, um einen Schlüsselwert zu erstellen . So:

SET media:1155315 939
GET media:1155315
> 939

wobei 1155315 die Bild-ID und 939 die Benutzer-ID ist. Wir verwenden jede Bild-ID als Schlüssel und die Benutzer-UID als Wert, um sie als Schlüssel-Wert-Paar zu speichern. Dann führten sie einen Test durch und speicherten die Daten gemäß der oben genannten Methode. 1.000.000 Daten verbrauchen 70 MB Speicher und 300.000.000 Fotos verbrauchen 21 GB Speicher. Verglichen mit dem Budget von 17 GB sind die Ausgaben immer noch zu hoch.

(NoSQLFan: Tatsächlich können wir hier einen Optimierungspunkt erkennen. Wir können das gleiche Medium vor dem Schlüsselwert entfernen und nur die Zahlen speichern. Dadurch wird die Länge des Schlüssels reduziert und der Speicheraufwand des Schlüssels verringert value [Hinweis: Redis Der Schlüsselwert wird nicht von einer Zeichenfolge in eine Zahl konvertiert. Daher werden hier nur 6 Byte Medien gespeichert: Nach Experimenten wird die Speichernutzung auf 50 MB reduziert und die Gesamtspeichernutzung beträgt 15 GB. (was ausreicht, um die Nachfrage zu befriedigen.)

Also fragten die Entwickler von Instagram Pieter Noordhuis, einen der Entwickler von Redis, nach dem Optimierungsplan, und die Antwort war, eine Hash-Struktur zu verwenden . Die spezifische Methode besteht darin, die Daten zu segmentieren und eine Hash-Struktur zum Speichern jedes Segments zu verwenden. Da die Hash-Struktur ein einzelnes Hash-Element komprimiert und speichert, wenn es kleiner als eine bestimmte Anzahl ist, kann dadurch viel Speicher gespart werden. Dies ist in der obigen String-Struktur nicht vorhanden. Der Parameter „hash-zipmap-max-entries“ in der Konfigurationsdatei steuert eine bestimmte Anzahl. Nach Experimenten von Entwicklern ist die Leistung besser, wenn hash-zipmap-max-entries auf 1000 eingestellt ist. Nach dem Überschreiten von 1000 wird der CPU-Verbrauch durch den HSET-Befehl sehr hoch.

Also änderten sie den Plan und speicherten die Daten in der folgenden Struktur:

HSET "mediabucket:1155" "1155315" "939"
HGET "mediabucket:1155" "1155315"
> "939"

Indem die ersten vier Ziffern der 7-stelligen Bild-ID als Schlüsselwert der Hash-Struktur verwendet werden, wird sichergestellt, dass jeder Hash nur a enthält 3-stelliger Schlüssel. Das ist 1.000.

Nach einem weiteren Experiment wurde festgestellt, dass pro 1.000.000 Schlüssel nur 16 MB Speicher verbraucht wurden. Außerdem wurde die Gesamtspeichernutzung auf 5 GB reduziert, was den Anwendungsanforderungen entspricht.

(NoSQLFan: Ebenso können wir hier noch optimieren. Ändern Sie zunächst den Schlüsselwert der Hash-Struktur in eine reine Zahl und reduzieren Sie so die Schlüssellänge um 12 Byte. Zweitens ändern Sie den Unterschlüsselwert in der Hash-Struktur in drei Ziffern , was den Overhead um weitere 4 Bytes reduziert, wie unten gezeigt. Nach dem Experimentieren wird der Speicherbedarf auf 10 MB reduziert, und der Gesamtspeicherbedarf beträgt 3 GB)

rrree

Das obige ist der detaillierte Inhalt vonWie Redis Speicher spart. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen