Heim >häufiges Problem >Was tun, wenn Redis blockiert?
Die Ereignisschleife von Redis wird in einem Thread verarbeitet. Da es sich um ein Single-Thread-Programm handelt, ist es wichtig, sicherzustellen, dass die Verzögerung der Ereignisverarbeitung kurz ist, damit nachfolgende Aufgaben in der Ereignisschleife nicht blockiert werden Redis-Daten erreichen Nach einem bestimmten Niveau (z. B. 20G) haben Blockierungsvorgänge einen besonders schwerwiegenden Einfluss auf die Leistung
Nachfolgend fassen wir die zeitaufwändigen Szenarien zusammen Redis und wie man damit umgeht Methode;
Lange zeitaufwändige Befehle führen zum Blockieren von
Tasten, Sortieren und anderen Befehlen
Der Befehl „keys“ wird verwendet, um alle Elemente zu finden, die einem bestimmten Muster entsprechen. Die zeitliche Komplexität des Musterschlüssels beträgt O(N) und N ist die Anzahl der Schlüssel in der Datenbank. Wenn die Anzahl der Elemente in der Datenbank mehrere zehn Millionen erreicht, führt dieser Befehl dazu, dass die Lese- und Schreibthreads mehrere Sekunden lang blockiert werden. Ähnliche Befehle umfassen Vorgänge wie Sunion-Sortierung; Anforderungen?
Lösung:
Im architektonischen Entwurf gibt es einen Trick der „Umleitung“, was bedeutet, die schnellen Verarbeitungsanforderungen und die langsamen Verarbeitungsanforderungen zu trennen Langsam wirkt sich auf den schnellen aus, was es für den schnellen unmöglich macht, schneller zu werden. Dies ist im Design von Redis' reiner Speicheroperation, der nicht blockierenden E/A-Ereignisverarbeitung, sehr offensichtlich Ein Thread und zeitaufwändige Vorgänge wie Persistenz, AOF-Umschreiben und Master-Slave-Synchronisierungsdaten sollten von einem separaten Prozess abgewickelt werden, um die Geschwindigkeit des langsamen Prozesses nicht gleichermaßen zu beeinträchtigen Da Schlüssel verwendet werden müssen, entfernen wir sie, z. B. durch das Öffnen eines separaten Redis-Slave-Knotens, insbesondere für zeitaufwändige Vorgänge wie Schlüssel und Sortierung. Diese Abfragen erfolgen im Allgemeinen nicht in Echtzeit. desto langsamer ist es, die Aufgabe zu erledigen, hat aber keinen Einfluss auf Online- und schnelle Aufgaben Wird verwendet, um den vollständigen Satz mit einer Zeitkomplexität von O(N) zu erhalten. N ist die Zahl in der Sammlung. Wenn mehrere zehn Millionen Daten in einer Sammlung gespeichert sind, führt ein Abruf auch dazu, dass der Ereignisverarbeitungsthread blockiert wird eine lange Zeit;
Lösung:
Im Gegensatz zu Befehlen wie Sortieren und Schlüsseln sind Smembers möglicherweise ein sehr häufig verwendeter Befehl in Online-Echtzeitanwendungsszenarien Dies ist hier nicht geeignet. Während des Entwurfs können wir die Anzahl der Sätze im Allgemeinen auf 500 beschränken. und die Datenmenge ist groß. Wir können 12 Schlüssel zum Speichern von Datensätzen für 12 Monate oder 365 Schlüssel zum Speichern von Datensätzen für jeden Tag verwenden und die Größe der Sammlung innerhalb eines akzeptablen Bereichs steuern Wenn es nicht einfach ist, die Sammlung in mehrere Untersammlungen aufzuteilen, Sie aber darauf bestehen, eine große Sammlung zum Speichern zu verwenden, können Sie beim Abrufen der Menge den SRANDMEMBER-Schlüssel [count] verwenden Wenn Sie alle Elemente in der Menge durchlaufen möchten, ist dieser Befehl natürlich nicht geeignet
Das obige ist der detaillierte Inhalt vonWas tun, wenn Redis blockiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!