


Eine kurze Diskussion über die Implementierungsmethoden der Nachrichtenwarteschlange und der verzögerten Nachrichtenwarteschlange in Redis
Wie implementiert Redis die Nachrichtenwarteschlange und die verzögerte Nachrichtenwarteschlange? Der folgende Artikel stellt Ihnen die Implementierungsmethoden der Nachrichtenwarteschlange und der verzögerten Nachrichtenwarteschlange in Redis vor. Ich hoffe, er wird Ihnen hilfreich sein!
Wenn es um Redis geht, denken vielleicht mehr Leute an die Verwendung als Cache. Tatsächlich kann Redis auch einige einfache Nachrichtenwarteschlangenzwecke implementieren. Wir können die Listendatenstruktur verwenden, um die Warteschlange zu implementieren. [Verwandte Empfehlungen: Redis-Video-Tutorial]
Mehrere Befehle für die Liste
lpush (Linksdruck)
wird von der linken Seite der Warteschlange gespeichert
rpush (Rechtsdruck)
wird von der rechten Seite gespeichert Seite der Warteschlange
lpop (linker Pop)
Von der linken Seite der Warteschlange herausziehen
rpop (rechter Pop)
Von der rechten Seite der Warteschlange herausziehen
Die oben genannten vier Befehle können eine Liste erstellen Helfen Sie uns bei der Implementierung von Warteschlangen oder Stapeln und den Merkmalen von Warteschlangen. Es gilt: „First in, first out“ und die Eigenschaft des Stapels ist „First in, last out“,
Die Warteschlangenimplementierung kann also lpush + rpop oder rpush + lpop verwenden,
Die Stack-Implementierung ist lpush + lpop oder rpush + rpop.
Verwenden Sie den Befehl, um die Warteschlange zu demonstrieren.
Der Produzent veröffentlicht Nachrichten Als Produzent veröffentlichen Sie Nachrichten. Der Verbraucher konsumiert Nachrichten. Da der Produzent rpush verwendet, muss der Verbraucher lpop verwenden in der Reihenfolge von 1 bis 5 auslesen und in der Reihenfolge vorlesen. Am Ende befinden sich keine Nachrichten in der Warteschlange und das Popup ist immer leer
Leeres AbfrageproblemVerwenden Sie lpop, um oben zu konsumieren Wenn Sie eine Nachricht öffnen, können Sie sehen, dass wir jedes Mal, wenn wir zum Pop gehen, eine leere Nachricht lesen, wenn es sich um einen manuellen Ausführungsbefehl handelt. Wenn es sich jedoch um ein Programm mit geschriebenem Code handelt, ist dies der Fall Wird weiterhin Pop-Daten (Abrufen von Daten) ausführen, führt dies zu leeren Abfragen (nutzloses Lesen), was nicht nur den CPU-Verbrauch des Clients erhöht, sondern auch die QPS von Redis erhöht und immer noch ein nutzloser Vorgang ist Infolgedessen reagiert der Zugriff anderer Clients auf Redis nur langsam. Lösung A (Ruhezustand)
Diese Lösung weist auch Mängel auf, d. h. die Verzögerung beim Nachrichtenverbrauch nimmt zu. Wenn nur ein Verbraucher vorhanden ist, beträgt die Verzögerung 1 Sekunde, d Es gibt Neuigkeiten und es muss immer noch bis zum Aufwachen 1 Sekunde warten, bevor es konsumiert wird.
Wenn es mehrere Verbraucher gibt, verringert sich die Latenz, da die Schlafzeit jedes Verbrauchers aufgeteilt ist. Gibt es jedoch einen besseren Weg, dies zu erreichen? fast 0 Latenz? Lösung B (Blockieren des Lesens) Wenn sich keine Daten in der Warteschlange befinden, wird sie sofort beantwortet und liest die Daten. Daher kann die Verwendung von blpop/brpop als Ersatz für lpop/rpop das Problem der Nachrichtenverzögerung lösen um 3 Attribute zur Warteschlange hinzuzufügen, 6, 7, 8Wenn der Client blockierende Lesevorgänge verwendet, wird der Dienst blockiert behandelt sie im Allgemeinen als eine inaktive Verbindung und trennt sie daher aktiv, um unnötige Verbindungen zu reduzieren, die Ressourcen belegen. Zu diesem Zeitpunkt löst der Client eine Ausnahme aus. Beachten Sie daher, dass Ausnahmen erfasst werden müssen, wenn der Client das blockierende Lesen verwendet Behandeln Sie sie entsprechend, z. B. Versuchen Sie es erneut.
Java-Client implementiert Nachrichtenwarteschlange
Thread.sleep(1000)
Ein weiterer oder mehrere Threads führen den Blpop-Verbrauch durch. Der fertige Code befindet sich unter: https://github.com/qiaomengnan16/redis-demo/tree/main/redis-queue
Publisher
Abonnieren
Die Implementierungsidee der Verzögerungswarteschlange
Die Verzögerungswarteschlange bedeutet, dass die Nachricht nach einer gewissen Zeit vom Verbraucher verbraucht wird und der Verbraucher sie nicht sofort lesen kann, nachdem die Nachricht gesendet wurde Erhalten it,
zset kann uns dabei helfen. Erstens kann zset einen Zeitstempel speichern, sodass wir jedes Mal, wenn wir eine Nachricht veröffentlichen, den aktuellen Zeitstempel plus den verzögerten Zeitstempel verwenden Der Verbraucher ruft die Nachricht ab, fängt die Daten von zset ab und erhält die Nachricht, die der aktuellen Zeit entspricht (d. h. es werden Daten mit einer Punktzahl kleiner oder gleich dem aktuellen Zeitstempel erhalten). Die Punktzahl ist kleiner oder gleich dem aktuellen Zeitstempel dass die Meldung die Zeit erreicht hat. Wenn sie größer ist, bedeutet dies, dass Sie eine Weile warten müssen, bevor Sie sie verwenden.
Tastenbefehle zadd (Herausgeber), zrangebyscore (Abonnent), zrem (Abonnent löscht nach Datenverbrauch)
BefehlsimplementierungWir haben zadd verwendet, um 4 Datenelemente hinzuzufügen, nämlich 1 und 2, Daten, die das können nach 3 Sekunden konsumiert werden (Pseudosprache, das ist eigentlich nur eine Punktzahl), und Kafka, das nach 10 Sekunden konsumiert werden kann,
Wenn es die dritte Sekunde erreicht hat, nehmen wir den Wert in zset, der größer ist kleiner oder gleich 1 Die Summe der Sekunden ist kleiner oder gleich 3 Sekunden an Daten, da die Daten in diesem Bereich genau das sind, was wir konsumieren können. Wie Sie sehen, haben wir 3 Datenelemente herausgenommen, die die Bedingungen erfüllen ,
Wenn wir jeweils nur ein Datenelement verbrauchen können, können Sie eine Begrenzungsbeschränkungsbedingung hinzufügen. Sie können das Bild unten sehen, um die ersten Daten herauszunehmen, die verbraucht werden können, redis
Beachten Sie gleichzeitig, dass es sich von den Listendaten lpop/ und blpop unterscheidet (sie löschen automatisch die Daten in der ursprünglichen Warteschlange, wenn sie angezeigt werden).
Obwohl die Daten abgerufen wurden, wenn zrem nicht verwendet wird Um es zu löschen, werden diese Daten weiterhin von anderen gelesen, da sie noch in zset vorhanden sind.
Zrem wurde jedoch möglicherweise von anderen vorbelegt. Im Falle des Löschens (Verbrauchs) muss der Code auch beurteilen, ob die Rückgabe erfolgt Wenn der Wert von zrem größer als 0 ist, können wir feststellen, ob wir diese Nachricht erfolgreich vorweggenommen haben und sie nach dem Erfolg korrekt verarbeiten.
Code-Implementierung
Verleger
Vollständige Codeadresse: https://github.com/ qiaomengnan16 /redis-demo/tree/main/redis-delayed-queue
Optimierung, implementiert mit LuaEs gibt ein Problem in der oben implementierten Verzögerungswarteschlange, d Wenn Sie so weiterlesen, ist es sehr wahrscheinlich, dass Sie sie mehrere Runden lang nicht abrufen können und die Ressourcen verschwendet werden. Daher können Sie sie mithilfe von Lua-Skripten optimieren Lassen Sie zrangebyscore und zrem zu einer atomaren Operation werden, was bedeutet, dass Multi-Thread-Konflikte vermieden und Ressourcen verschwendet werden können, die nicht abgerufen werden können.
Fazit
Einige professionelle Warteschlangen-Middleware ist komplizierter anzuwenden und erhöht die Betriebs- und Wartungskosten, wie z. B. RabbitMQ. Bevor Sie eine Nachricht senden, müssen Sie einen Exchange-Switch erstellen Warteschlange und dann Exchange und Queue Zum Binden müssen Sie beim Senden einer Nachricht den Routing-Schlüssel angeben, der mit Exchange übereinstimmt und schließlich die Warteschlange erreicht. Wenn das Szenario einfach ist, können Sie Redis verwenden, um eine Warteschlange zu implementieren, dies sollte jedoch der Fall sein Beachten Sie, dass Redis nicht über die Eigenschaften einer professionellen Warteschlange verfügt. Dies bedeutet, dass die Nachricht unzuverlässig ist, wenn sie 100 % zuverlässig ist Professionelle Warteschlangen-Middleware und andere Mechanismen wie Ack als Garantie.
Weitere Kenntnisse zum Thema Programmierung finden Sie unter:
Einführung in die Programmierung! !
Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über die Implementierungsmethoden der Nachrichtenwarteschlange und der verzögerten Nachrichtenwarteschlange in Redis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Der Redis -Cluster -Modus bietet Redis -Instanzen durch Sharding, die Skalierbarkeit und Verfügbarkeit verbessert. Die Bauschritte sind wie folgt: Erstellen Sie ungerade Redis -Instanzen mit verschiedenen Ports; Erstellen Sie 3 Sentinel -Instanzen, Monitor -Redis -Instanzen und Failover; Konfigurieren von Sentinel -Konfigurationsdateien, Informationen zur Überwachung von Redis -Instanzinformationen und Failover -Einstellungen hinzufügen. Konfigurieren von Redis -Instanzkonfigurationsdateien, aktivieren Sie den Cluster -Modus und geben Sie den Cluster -Informationsdateipfad an. Erstellen Sie die Datei nodes.conf, die Informationen zu jeder Redis -Instanz enthält. Starten Sie den Cluster, führen Sie den Befehl erstellen aus, um einen Cluster zu erstellen und die Anzahl der Replikate anzugeben. Melden Sie sich im Cluster an, um den Befehl cluster info auszuführen, um den Clusterstatus zu überprüfen. machen

Redis verwendet Hash -Tabellen, um Daten zu speichern und unterstützt Datenstrukturen wie Zeichenfolgen, Listen, Hash -Tabellen, Sammlungen und geordnete Sammlungen. Ernähren sich weiterhin über Daten über Snapshots (RDB) und appendiert Mechanismen nur Schreibmechanismen. Redis verwendet die Master-Slave-Replikation, um die Datenverfügbarkeit zu verbessern. Redis verwendet eine Ereignisschleife mit einer Thread, um Verbindungen und Befehle zu verarbeiten, um die Datenatomizität und Konsistenz zu gewährleisten. Redis legt die Ablaufzeit für den Schlüssel fest und verwendet den faulen Löschmechanismus, um den Ablaufschlüssel zu löschen.

Schritte zur Lösung des Problems, das Redis-Server nicht finden kann: Überprüfen Sie die Installation, um sicherzustellen, dass Redis korrekt installiert ist. Setzen Sie die Umgebungsvariablen Redis_host und Redis_port; Starten Sie den Redis-Server Redis-Server; Überprüfen Sie, ob der Server Redis-Cli Ping ausführt.

Um alle Schlüssel in Redis anzuzeigen, gibt es drei Möglichkeiten: Verwenden Sie den Befehl keys, um alle Schlüssel zurückzugeben, die dem angegebenen Muster übereinstimmen. Verwenden Sie den Befehl scan, um über die Schlüssel zu iterieren und eine Reihe von Schlüssel zurückzugeben. Verwenden Sie den Befehl Info, um die Gesamtzahl der Schlüssel zu erhalten.

Um die Redis -Versionsnummer anzuzeigen, können Sie die folgenden drei Methoden verwenden: (1) Geben Sie den Info -Befehl ein, (2) Starten Sie den Server mit der Option --version und (3) die Konfigurationsdatei anzeigen.

Der beste Weg, um Redis -Quellcode zu verstehen, besteht darin, Schritt für Schritt zu gehen: Machen Sie sich mit den Grundlagen von Redis vertraut. Wählen Sie ein bestimmtes Modul oder eine bestimmte Funktion als Ausgangspunkt. Beginnen Sie mit dem Einstiegspunkt des Moduls oder der Funktion und sehen Sie sich die Codezeile nach Zeile an. Zeigen Sie den Code über die Funktionsaufrufkette an. Kennen Sie die von Redis verwendeten Datenstrukturen. Identifizieren Sie den von Redis verwendeten Algorithmus.

Die Verwendung der REDIS -Anweisung erfordert die folgenden Schritte: Öffnen Sie den Redis -Client. Geben Sie den Befehl ein (Verbschlüsselwert). Bietet die erforderlichen Parameter (variiert von der Anweisung bis zur Anweisung). Drücken Sie die Eingabetaste, um den Befehl auszuführen. Redis gibt eine Antwort zurück, die das Ergebnis der Operation anzeigt (normalerweise in Ordnung oder -err).

Redis bestellte Sets (ZSETs) werden verwendet, um bestellte Elemente und Sortieren nach zugehörigen Bewertungen zu speichern. Die Schritte zur Verwendung von ZSET umfassen: 1. Erstellen Sie ein Zset; 2. Fügen Sie ein Mitglied hinzu; 3.. Holen Sie sich eine Mitgliederbewertung; 4. Holen Sie sich eine Rangliste; 5. Holen Sie sich ein Mitglied in der Rangliste; 6. Ein Mitglied löschen; 7. Holen Sie sich die Anzahl der Elemente; 8. Holen Sie sich die Anzahl der Mitglieder im Score -Bereich.
