Heim  >  Artikel  >  Datenbank  >  So lösen Sie das Big-Key-Problem in Redis

So lösen Sie das Big-Key-Problem in Redis

王林
王林nach vorne
2023-05-27 14:41:483250Durchsuche

1. Was ist Big Key?

Einfach ausgedrückt bedeutet Big Key, dass der Wert, der einem bestimmten Schlüssel entspricht, sehr groß ist und viel Redis-Speicherplatz einnimmt. Es handelt sich im Wesentlichen um ein großes Wertproblem. Der Schlüssel kann häufig vom Programm selbst festgelegt werden, der Wert wird jedoch häufig nicht vom Programm gesteuert, sodass der Wert möglicherweise sehr groß ist.

Die diesen Big Keys entsprechenden Werte in Redis sind sehr groß und nehmen im Serialisierungs-/Deserialisierungsprozess viel Zeit in Anspruch. Daher ist die Bedienung von Big Key normalerweise zeitaufwändig, was zu einer Blockierung von Redis führen kann . Dadurch wird die Redis-Leistung reduziert.

Verwenden Sie mehrere praktische Beispiele, um die Eigenschaften großer Schlüssel zu beschreiben:

● Ein Schlüssel vom Typ String, sein Wert beträgt 5 MB (Daten sind zu groß);

● Ein Schlüssel vom Typ Liste, seine Anzahl an Listen beträgt 20.000 ( zu viele Listen);

● Ein Schlüssel vom Typ ZSet mit 10.000 Mitgliedern (zu viele Mitglieder);

● Ein Schlüssel im Hash-Format mit nur 1.000 Mitgliedern, aber die Gesamtwertgröße dieser Mitglieder beträgt 100 MB (die Mitgliedsgröße ist zu groß) ;

Im tatsächlichen Geschäft muss die Bestimmung großer Schlüssel noch umfassend anhand der tatsächlichen Nutzungsszenarien und Geschäftsszenarien von Redis beurteilt werden. Normalerweise wird es anhand der Größe der Daten und der Anzahl der Mitglieder beurteilt.

2. Die Szene, in der Big Key auftritt?

1. Unsachgemäße Verwendung der Redis-Datenstruktur

Die Verwendung von Redis in Szenarien, die für seine Funktionen nicht geeignet sind, führt dazu, dass der Wert des Schlüssels zu groß ist, wie z. B. die Verwendung eines Schlüssels vom Typ String zum Speichern großer Binärdateidaten.

2. Versäumnis, Junk-Daten rechtzeitig zu bereinigen

Da ungültige Daten nicht regelmäßig bereinigt werden, steigt die Anzahl der Mitglieder im HASH-Typschlüssel weiter an. Der Wert erhöht sich unendlich, da nur weiterhin Daten ohne Löschmechanismus empfangen werden.

3. Ungenaue Geschäftsschätzungen

Unzureichende Berücksichtigung bei der Planung und Gestaltung vor der Geschäftsgründung und die Mitglieder im Schlüssel wurden nicht sinnvoll aufgeteilt, was dazu führte, dass es zu viele Mitglieder in einzelnen Schlüsseln gab.

4. Liste der Fans von Prominenten und Internet-Prominenten sowie eine Liste von Kommentaren zu einer bestimmten aktuellen Nachricht.

Angenommen, wir verwenden die Listendatenstruktur, um die Fans eines bestimmten Prominenten/Internet-Prominenten zu speichern Liste der Kommentare zu heißen Nachrichten, da die Anzahl der Fans riesig ist. Heiße Nachrichten haben viele Klickraten und Kommentare, daher werden viele Elemente in der Listensammlung gespeichert, was dazu führen kann, dass der Wert zu niedrig ist groß, was ein Big-Key-Problem verursacht.

3. Was sind die Gefahren von Big Key?

1. Blockieren von Anfragen

Der Wert, der Big Key entspricht, ist relativ groß. Wenn wir ihn lesen und schreiben, dauert es lange, was die nachfolgende Anforderungsverarbeitung blockieren kann. Der Kernthread von Redis ist Single-Threaded, was bedeutet, dass alle Anforderungen seriell verarbeitet werden. Wenn die vorherige Anforderung nicht abgeschlossen ist, wird die nachfolgende Anforderung nicht verarbeitet.

2. Erhöhter Speicher

Der durch das Lesen von Big Key verbrauchte Speicher erhöht sich im Vergleich zum normalen Schlüssel. Wenn er weiter zunimmt, kann es zu OOM (Speicherüberlauf) kommen oder den maximalen Speicher-Maximemory-Einstellungswert von Redis erreichen Bewirkt eine Schreibblockierung oder die Entfernung wichtiger Schlüssel.

3. Blockiertes Netzwerk

Wenn ein großer Einzelwert gelesen wird, belegt er mehr Bandbreite der Servernetzwerkkarte, verlangsamt sich selbst und kann andere Redis-Instanzen oder Anwendungen auf dem Server beeinträchtigen.

4. Auswirkungen auf die Master-Slave-Synchronisation und den Master-Slave-Wechsel

Das Löschen eines großen Schlüssels führt dazu, dass die Hauptbibliothek für lange Zeit blockiert wird und eine Synchronisationsunterbrechung oder ein Master-Slave-Wechsel auftritt.

4. Wie erkennt man Big Key?

1. Verwenden Sie die mit redis gelieferte Befehlsidentifikation. Sie können beispielsweise den offiziellen Redis-Client redis-cli plus den Parameter --bigkeys verwenden, um die 5 Datentypen einer bestimmten Instanz (String, Hash, list, set, zset)s größter Schlüssel. Der Vorteil besteht darin, dass es online gescannt werden kann, ohne dass der Dienst blockiert wird. Der Nachteil besteht darin, dass weniger Informationen vorhanden sind und der Inhalt nicht genau genug ist.


2. Verwenden Sie den Befehl debug object key, um den Schlüssel entsprechend dem eingehenden Objekt (dem Namen des Schlüssels) zu analysieren und eine große Datenmenge zurückzugeben. Der Wert von serializedlength ist die serialisierte Länge des Schlüssels. Es ist zu beachten, dass die serialisierte Länge des Schlüssels nicht mit seiner tatsächlichen Länge im Speicherbereich übereinstimmt. Darüber hinaus ist das Debug-Objekt ein Debugging-Befehl, dessen Ausführung teuer ist und bei dessen Ausführung andere Anforderungen eingehen Redis wird blockiert, bis es ausgeführt wird. Da immer nur die Informationen eines einzelnen Schlüssels gefunden werden können, wird dies offiziell nicht empfohlen.

3. Redis-rdb-tools Open-Source-Tool

Diese Methode besteht darin, bgsave auf der Redis-Instanz auszuführen, die Snapshot-Sicherung von Redis auszulösen, die RDB-Persistenzdatei zu generieren und dann die gesicherte RDB-Datei zu analysieren. Finde den großen Schlüssel.

Der Vorteil besteht darin, dass die erhaltenen Schlüsselinformationen detailliert sind, es viele optionale Parameter gibt und benutzerdefinierte Anforderungen unterstützt werden. Die Ergebnisinformationen können im JSON- oder CSV-Format ausgewählt werden und die anschließende Verarbeitung ist bequem Operation und es dauert lange, bis die Ergebnisse vorliegen. 5. Wie löst man das Big-Key-Problem?

Um das Big-Key-Problem zu lösen, reicht es aus, die Größe des dem Schlüssel entsprechenden Werts zu reduzieren, d. h. für die String-Datenstruktur die Länge der gespeicherten Zeichenfolge für List, Hash, Set zu reduzieren. und ZSet-Datenstrukturen, wodurch die Menge der Elemente reduziert wird.

1. Teilen Sie den großen Schlüssel

Teilen Sie einen großen Schlüssel in mehrere kleine Schlüssel auf, z. B. einen Schlüsselwert, und stellen Sie sicher, dass die Anzahl oder Größe jedes Schlüssels in einem angemessenen Bereich liegt. Speichern Sie ihn dann, indem Sie verschiedene Schlüssel abrufen oder mget verwenden, um sie stapelweise abzurufen.

2. Bereinigen Sie die großen Schlüssel

Bereinigen Sie die großen Schlüssel in Redis und löschen Sie solche Daten aus Redis. Redis stellt seit 4.0 den UNLINK-Befehl zur Verfügung, mit dem eingehende Schlüssel langsam und nicht blockierend bereinigt werden können. Mit UNLINK können Sie große oder sogar besonders große Schlüssel sicher löschen.

3. Überwachen Sie den Speicher, die Netzwerkbandbreite, das Timeout und andere Indikatoren von Redis.

Durch Überwachen des Systems und Festlegen eines angemessenen Alarmschwellenwerts für den Redis-Speicher, um uns daran zu erinnern, dass zu diesem Zeitpunkt möglicherweise große Schlüssel generiert werden, z. B. Redis-Speicher Die Nutzung übersteigt 70 %, die Wachstumsrate des Redis-Speichers übersteigt 20 % innerhalb einer Stunde usw.

4. Bereinigen Sie regelmäßig ungültige Daten.

Wenn ein bestimmter Schlüssel inkrementell eine große Datenmenge schreibt, die Aktualität der Daten jedoch ignoriert wird, kommt es zu einer Anhäufung großer Mengen ungültiger Daten. Ungültige Daten können durch geplante Aufgaben bereinigt werden. 5. Wert komprimieren Wenn der Wert nach der Komprimierung immer noch sehr groß ist, können Sie über eine weitere Aufteilung des Schlüssels nachdenken.

Ergänzendes Wissen: Schlüsseldesign(1) [Empfehlung]: Lesbarkeit und Verwaltbarkeit

Stellen Sie dem Firmennamen (oder Datenbanknamen) ein Präfix voran (um Schlüsselkonflikte zu vermeiden) und trennen Sie ihn durch einen Doppelpunkt, z. B. den Firmennamen: Tabellenname: id

o2o: order:1

(2) [Vorschlag]: Einfachheit


Kontrollieren Sie die Länge des Schlüssels und stellen Sie gleichzeitig die Semantik sicher. Wenn viele Schlüssel vorhanden sind, kann die Speichernutzung nicht ignoriert werden, zum Beispiel:

user:{uid}:friends:messages:{mid} wird vereinfacht zu u:{uid}m:{mid}

(3) [Obligatorisch]: Keine Sonderzeichen einschließen


Gegenbeispiel: Leerzeichen einschließen , Zeilenumbrüche, einzelne Zeichen, doppelte Anführungszeichen und andere Escape-Zeichen

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Big-Key-Problem in Redis. 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