Redis Xread

Redis Xread

Redisströme, Verbraucher und Blockiervorgänge

Redis führte die Streams vor, die die Protokolldatenstruktur mit Version 5 nachahmen.0. Stream ist eine Nur-Append-Datenstruktur mit einem umfassenderen Vorgangssatz als in einer Protokolldatei. Es ist einer der komplexesten Datentypen in Redis, da es zusätzliche Blockierungsvorgänge implementiert, mit denen die Kunden auf die neuen Stream -Daten warten können. Dies ähnelt dem Verhalten von Redis Pub/Sub- oder Blockierungslisten, aber es gibt grundlegende Unterschiede, wenn es darum geht, wie die Verbraucher die Redis -Stream -Daten konsumieren.

Wie in der vorherigen Abbildung gezeigt, sind mehrere Vorteile gegenüber Redis Pub/Sub- und Blockierungslisten zu sehen. Jeder neue Datenelement wird an jeden Verbraucher geliefert. Anders als in den Listen, die das Listenelement entfernen, sobald sie zu Blpop oder BRPOP aufgerufen werden, bleiben die Stream -Elemente so wie im Stream. Der Befehl XRead wird als Blockier- und nicht blockierender Kandidat auf den Redis-Streams wirkt.

Der XRead -Befehl

Der XRead -Befehl kann die Einträge aus mehreren Streams gleichzeitig abrufen, während die zurückgegebenen Einträge eine größere ID haben als die zuletzt empfangene ID für einen bestimmten Verbraucher. Es kann sowohl auf blockierende als auch nicht blockierende Weise funktionieren. In der nicht blockierenden Natur verhält sich der Befehl dem XRange-Befehl sehr ähnlich, aber einige zusätzliche Funktionen, die im Folgenden aufgeführt sind:

  • Es kann die Einträge ab dem jüngsten Eintrag mit der größten ID abrufen als jeder andere Element im Stream.
  • Es kann aus mehreren Streams gleichzeitig gelesen werden.

Dieser Befehl hat eine lineare Zeitkomplexität, wenn die N -Anzahl der Elemente im Stream gespeichert ist. Daher ist die zeitliche Komplexität mit fester Rückgabebereich konstant.

Der Befehl xRead folgt der folgenden Syntax:

Syntax:

XREAD [zählen Number_of_returned_elements] [Block Blocking_time_in_milliseconds] Streams Key [Schlüssel…] ID [ID…]

ZÄHLEN : Die Anzahl der Elemente, die vom Befehl zurückgegeben werden sollen. Es begrenzt die zurückgegebenen Zeilen auf eine bestimmte Zahl.

BLOCK : Die maximale Zeit, um zu warten, bis ein neuer Artikel im Stream angezeigt wird.

Die beiden vorherigen Optionen sind optional für den Befehl.

Ströme: Der Schlüssel des Streams. Dies ist eine obligatorische Option und muss die letzte Option im Befehl sein, da sie die variable Länge von Schlüssel- und Eintrags -IDs akzeptiert.

: Die ID des Stream -Eintrags.

Mehrere Schlüssel können angegeben werden, da der Befehl Sie ermöglicht, aus mehr als einem Stream zu lesen. Gleichzeitig können mehrere IDs bereitgestellt werden.

Dieser Befehl gibt eine Array -Antwort zurück. Jedes Array -Element besteht aus zwei Elementen, wie im folgenden Format gezeigt:

Beispiel 1: Überprüfen Sie die Wetterdaten für zwei Standorte mit nicht blockierender Xread

Nehmen wir an, wir haben zwei Streams, die die Wetterdaten für LA und NYC enthalten. Auf unserer Weather Data Publication -Site müssen wir sowohl aus Streams konsumieren und die neuesten Wetterdaten für diese beiden Standorte abrufen. Der Befehl xRead ist der ideale Kandidat, der in diesem Szenario mit seiner nicht blockierenden Variante verwendet werden kann.

Es ist Zeit, zwei benannte Streams zu erstellen Wetter: NYC Und Wetter: la und bevölkern ein paar Einträge mit einigen Feldwertpaaren, wie im Folgenden gezeigt:

XADD WETTER: NYC * Wind 45 Feuchtigkeit 78 Temp 12
Xadd Wetter: La * Wind 12 Feuchtigkeit 45 Temp 22

Beide Streams Wetter: NYC Und Wetter: LC werden erfolgreich erstellt und die zurückgegebenen Einstiegs -IDs sind 1658114094434-0 Und 1658114110474-0, bzw.

Verwenden wir den Befehl xRead, um gleichzeitig nicht blockierend aus beiden Streams zu lesen.

Xread Streams Wetter: NYC Wetter: la 0 0

Wie erwartet enthält die Ausgabe die Einträge aus beiden Streams, wobei die ID -Sequenz ab 0 beginnt. Es ist akzeptabel, die unvollständigen IDs wie zuvor dargestellt anzugeben, wobei beide IDs 0 sind, was der Millisekunden -Zeitstempel ohne Sequenznummer ist. Daher kann der vorherige Befehl wie in Folgendes geschrieben werden:

Xread Streams Wetter: NYC Wetter: LA 0-0 0-0

Fügen wir jetzt ein paar Einträge zu beiden Streams hinzu.

Xadd Wetter: NYC * Wind 10 Feuchtigkeit 60 Temp 10
Xadd Wetter: la * Wind 18 Luftfeuchtigkeit 80 Temp 5

Da wir bereits die neuesten Eintrags -IDs für beide Streams aus den vorherigen Befehlen haben.

Xread Streams Wetter: NYC Wetter: LA 1658114094434-0 1658114110474-0

Wie Sie sehen konnten, stammen die angegebenen IDs aus der vorherigen Abfrage. Jetzt gibt der Befehlsaufruf alle Einträge zurück, die größere IDs haben als die angegebenen.

Wie Sie sehen können, werden die neu hinzugefügten Einträge aus dem vorherigen Befehl zurückgegeben. Als nächstes können Sie die Eintrags -IDs nehmen, die aus dem vorherigen Befehl zurückgegeben wurden, und rufen Sie den Xread mit diesen IDs an, bis das zurückgegebene Array leer ist.

Beispiel 2: Holen Sie sich die neuesten Pizza -Promos mit Blocking Xread

Es gibt eine weitere Variante des XRead-Befehls, mit dem Sie warten können, bis die Verlage neue Daten zum Stream veröffentlichen, ohne sofort als nicht blockierter Anruf zu enden. Nehmen wir ein Szenario an, in dem die Pizza -Jungs alle Kunden über die neuesten verfügbaren Promos die Benachrichtigungen weitergeben möchten. Es könnte an bestimmten Tagen keine Promos geben. Daher sollten die Kunden warten, bis die neuen Promos verfügbar sind. Es kann mit dem XRead -Befehl mit der Blockoption erreicht werden.

Nehmen wir an, dass die Pizza -Firma die Promo -Details in einem Stream namens veröffentlichen Pizzapromos: Täglich. Daher können wir den Befehl Xread verwenden, um zu warten, bis ein neuer Promo -Element zum Stream hinzugefügt wird.

Xread Block 50000 Streams PizzapromosNew: Daily $

In diesem Fall geben wir die Eintrags -ID als $ an, die als Top -Eintrags -ID interpretiert wird. Daher wird der Befehl nur die zum Stream hinzugefügten neuen Einträge abfragen und nicht die historischen Einträge.

Da wir dem Stream keine neuen Einträge hinzugefügt haben, wird es nach 50000 Millisekunden mit a einzeit Null Return wie in Folgendes gezeigt:

Fügen wir nun den Stream mit dem XADD einen Eintrag in den Stream hinzu, während ein anderer Verbraucher mit dem XRead -Befehl auf die Daten wartet, wie in Folgendes gezeigt:

Wie erwartet wird der zusätzliche Eintrag sofort vom Verbraucher konsumiert. Aus dem nächsten Anruf müssen wir sicherstellen, dass wir die ID übergeben, die von diesem Befehl zurückgegeben wird, und nicht die $ $. Wenn nicht, werden wir die dazwischen hinzugefügten Einträge vermissen.

Wenn mehrere Clients auf denselben Stream warten, werden die neu hinzugefügten Daten sofort zu allen von ihnen übergeben. Der XRead -Befehl ist ein sehr nützlicher und empfohlener Befehl, um die Naturanwendungen zu blockieren.

Abschluss

Zusammenfassend ist der Befehl Xread einer der weit verbreiteten Befehle, die auf den Redis -Streams arbeiten. Es kann sowohl auf blockierende als auch auf nicht blockierende Weise funktionieren. Wie erläutert ist die nicht blockierende Variante dem XRange-Befehl mit ein paar Unterschieden sehr ähnlich. Zusätzlich kann dieser Befehl mit der Blockoption verwendet werden, um zu warten, bis die Verleger neue Daten zum Stream veröffentlichen. Insgesamt ist der XRead -Befehl darauf spezialisiert, die Daten aus mehreren Streams gleichzeitig zu konsumieren. Es ist eine hilfreiche Funktion, nach der die modernen Anwendungen suchen.