Redis verfügt über mehrere Blockierungsbefehle, die auf Listendatenstrukturen arbeiten. Der Befehl LPOP wird verwendet, um ein Element vom Kopf einer bestimmten Liste zu entfernen. Es wird das Kopfelement aus der Liste entfernt und sofort zurückgegeben. Das entfernte Element erreicht den Client. Immer wenn in der Liste keine Elemente vorhanden sind, kehrt der Befehl sofort mit einem Nullwert zurück. Die Blockierungsvariante ist der BLPOP -Befehl, der die Verbindung zum Server hält, wenn in der Liste keine Elemente vorhanden sind. Der BLPOP -Befehl wartet, bis mindestens ein Element in der Liste angezeigt wird, um zurückzukehren. Es stehen mehrere Blockierungsbefehle zur Verfügung, die mit Listen verwendet werden können. In diesem Leitfaden konzentrieren wir uns auf den Befehl BRPOPLPUSH.
Redis BRPOPLPUSH -Befehl
Der Befehl BRPOPLPUSH ist die Blockierungsvariante des Befehls rpoplpush. Daher verhält sich der Befehl BRPOPLPUSH mit dem Befehl rpoplpush, wenn ein oder mehrere Elemente in der Quellliste verfügbar sind. Immer wenn sich kein einzelnes Element in der Liste befindet, enthält der Befehl BRPOPLPUSH die Verbindung zum Redis -Server, bis ein Element in der Quellliste verfügbar ist.
Syntax:
BRPOPLPUSH SOURCE_LIST Destination_List Timeout
Quellenverzeichnis: Die Liste, aus der Elemente entfernt werden
Destination_List: Die Liste, in die die Elemente eingedrückt werden
Auszeit: Die Zeit, die Verbindung zu blockieren und sie am Leben zu erhalten.
Der Befehl BRPOPLPUSH entfernt ein Element vom Schwanz des Quellenverzeichnis, Erste. Dann wird das Element in der Nähe des Kopfes eines anderen gedrückt Destination_List. Immer wenn die Quelle leer ist, wird die Verbindung wie im Folgenden angezeigt:
Dieser Befehl hat eine konstante Zeitkomplexität und wurde von Redis Version 6 veraltet.2.0. Es wird empfohlen, die zu verwenden Blmove Befehl mit RECHTS Und LINKS Argumente. Der Befehl BRPOPLPUSH gibt das Element zurück, das aus der Quelle gestoßen und in das Ziel gedrückt wird. Die Ausgabe ist ein Nullwert, wenn die Zeitüberschreitung erreicht ist.
Beispiel - Messaging -Server mit Zuverlässigkeitswarteschlangen
Nehmen wir an, dass ein Messaging -Server Zuverlässigkeitswarteschlangen verwendet, um zehn Hintergrundjobs für eine bestimmte Anwendung zu speichern. Die serverseitige Liste wurde verwendet, um die IDs jedes Hintergrundjobs zu speichern. Mehrere Kunden konsumieren die Liste, indem sie Hintergrundjobs vom Schwanz erhalten.
Der größte Nachteil dieses Prozesses ist: Wenn ein Netzwerk oder ein Fehler bei der Client-Anwendung vorliegt, geht das zurückgegebene Stück vor der Verarbeitung auf der Client-Seite verloren. Daher ist eine separate zuverlässige Warteschlange erforderlich, um das gepackte Element aus der Quellliste zu speichern, während es an den Client zurückgibt. Darüber hinaus ist die Quellliste möglicherweise leer, wenn keine Hintergrundjobs von Verlagen erstellt werden. Daher benötigen wir eine Möglichkeit, dass die Kundenverbindung gehalten und lebendig wird, bis ein Hintergrundjob in der Quellliste verfügbar ist. Der Befehl BRPOPLPUSH ist der ideale Kandidat, um dies zu erreichen.
Lassen Sie uns mit dem Befehl BRPOPLPUSH auf den REDIS -Server aufrufen, wie im Folgenden gezeigt. Sowohl die Quell- als auch die Zielschlüssel existieren nicht.
BRPOPLPUSH BINTERGYJOBS_LIST RAUFISHQUEUE_LIST 0
Wir haben das Timeout -Argument für 0 angegeben, was bedeutet. Jetzt wartet es darauf, dass mindestens ein einzelner Hintergrundjob in der Liste verfügbar ist, die in Key gespeichert ist Hintergrundjobs_List.
Als nächstes werden wir einen Hintergrundjob zur Hintergrundjobs_List Liste wie im Folgenden gezeigt. Verwenden wir den Befehl LPush, um einen einzelnen Hintergrundjob mit der ID von zu verschiebenB1”.
Wie erwartet wurde das B1 -Element an den Kunden zurückgegeben, der die Verbindung hielt, bis ein Element in der Quellliste verfügbar ist Hintergrundjobs_List. Lassen Sie uns die Zielwarteschlange untersuchen Reliablequeue_List. Hier verwenden wir die Lrange Befehl wie im Folgenden gezeigt:
lRange RelableQueue_List 0 10
Die Zielwarteschlange enthält das Element "B1", das aus der Quellliste gestoßen ist. Dieser Befehl garantiert, dass die Elemente in einer anderen Warteschlange gespeichert werden, ohne sie zu verlieren, wenn ein Kunde abstürzt. Der Befehl BRPOPLPUSH kann als zirkuläre Liste verwendet werden, wenn sowohl Quelle als auch Ziel gleich sind.
Abschluss
Zusammenfassend lässt sich sagen. Die meisten Befehle sind nicht blockiert, wenn der Befehl unmittelbar nach Abschluss des Jobs zurückgegeben wird. Wie erläutert, stehen mehrere eingebaute Blockierungsbefehle zur Verfügung, um auf Listentypen zu arbeiten. Der Befehl BRPOPLPUSH ist einer von ihnen. Wie Sie bereits wissen, ist es die Blockierungsvariante des Befehls rpoplpush. Es verhält sich genauso wie der Befehl rpoplpush, wenn mindestens ein einzelnes Element in der Quellliste gespeichert ist. Immer wenn die Quellliste nicht vorhanden ist, wartet der Befehl BRPOPLPUSH auf ein bestimmtes Timeout, bis ein Element in der Quellliste vorhanden ist. Wie bereits erwähnt, ist es, da es eine konstante Zeitkomplexität aufweist, sehr effizient mit zuverlässigen Warteschlangen in den Messaging -Servern zu verwenden.