Verwendung von Redis Streams

Roshan Kumar ist Senior Product Manager bei Redis Labs.

Redis, die speicherinterne Datenbank mit mehreren Modellen, ist für viele Anwendungsfälle beliebt. Dazu gehören Content-Caching, Sitzungsspeicher, Echtzeitanalysen, Nachrichtenvermittlung und Daten-Streaming. Letztes Jahr habe ich darüber geschrieben, wie man Redis Pub / Sub, Listen und sortierte Sets für die Echtzeit-Stream-Verarbeitung verwendet. Mit der Einführung von Redis 5.0 verfügt Redis nun über eine brandneue Datenstruktur zur Verwaltung von Streams.

Mit der Datenstruktur von Redis Streams können Sie viel mehr tun, als mit Pub / Sub, Listen und sortierten Sets möglich war. Unter den vielen Vorteilen von Redis Streams können Sie Folgendes tun:

  • Sammeln Sie große Datenmengen, die mit hoher Geschwindigkeit ankommen (der einzige Engpass ist Ihre Netzwerk-E / A).
  • Erstellen Sie einen Datenkanal zwischen vielen Herstellern und vielen Verbrauchern.
  • Verwalten Sie Ihren Datenverbrauch effektiv, auch wenn Hersteller und Verbraucher nicht mit der gleichen Geschwindigkeit arbeiten.
  • Behalten Sie Daten bei, wenn Ihre Kunden offline oder nicht verbunden sind.
  • Asynchron zwischen Produzenten und Konsumenten kommunizieren;
  • Skalieren Sie Ihre Anzahl von Verbrauchern.
  • Implementieren Sie transaktionsähnliche Datensicherheit, wenn Verbraucher beim Konsumieren von Daten versagen. und
  • Nutzen Sie Ihren Hauptspeicher effizient.

Das Beste an Redis Streams ist, dass es in Redis integriert ist, sodass keine zusätzlichen Schritte zum Bereitstellen oder Verwalten von Redis Streams erforderlich sind. In diesem Artikel werde ich Sie durch die Grundlagen der Verwendung von Redis Streams führen. Wir werden untersuchen, wie wir einem Stream Daten hinzufügen können und wie wir diese Daten lesen können (alle auf einmal, asynchron, sobald sie eintreffen usw.), um verschiedene Anwendungsfälle für Verbraucher zu erfüllen.

In zwei zukünftigen Artikeln werde ich die Funktionsweise der Verbrauchergruppen von Redis Streams erläutern und eine funktionierende Anwendung zeigen, die Redis Streams verwendet.

Datenfluss in Redis Streams verstehen

Redis Streams bietet eine Datenstruktur zum Anhängen, die Protokollen ähnelt. Es bietet Befehle, mit denen Sie Streams Quellen hinzufügen, Streams konsumieren und überwachen können, wie Daten konsumiert werden. Die Streams-Datenstruktur ist flexibel und ermöglicht es Ihnen, Produzenten und Konsumenten auf verschiedene Weise miteinander zu verbinden.

Redis Labs

Abbildung 1 zeigt die grundlegende Verwendung von Redis Streams. Ein einzelner Produzent fungiert als Datenquelle, und sein Konsument ist eine Messaging-Anwendung, die Daten an die relevanten Empfänger sendet.

Redis Labs

In Abbildung 2 wird ein gemeinsamer Datenstrom von mehr als einem Verbraucher verwendet. Mit Redis Streams können Verbraucher die Daten in ihrem eigenen Tempo lesen und analysieren.

In der nächsten Anwendung, die in Abbildung 3 dargestellt ist, werden die Dinge etwas komplexer. Dieser Dienst empfängt Daten von mehreren Herstellern und speichert sie alle in einer Redis Streams-Datenstruktur. Die Anwendung hat mehrere Verbraucher, die die Daten von Redis Streams lesen, sowie eine Verbrauchergruppe, die Verbraucher unterstützt, die nicht mit der gleichen Geschwindigkeit wie die Hersteller arbeiten können.

Redis Labs

Fügen Sie mit Redis Streams Daten zu einem Stream hinzu

Das Diagramm in Abbildung 3 zeigt nur eine Möglichkeit, Daten zu einem Redis-Stream hinzuzufügen. Obwohl ein oder mehrere Hersteller der Datenstruktur Daten hinzufügen können, werden alle neuen Daten immer an das Ende des Streams angehängt.

Die Standardmethode zum Hinzufügen von Daten

Dies ist der einfachste Weg, um Daten zu Redis Streams hinzuzufügen:

XADD mystream * Name Anna

XADD mystream * name Bert

XADD mystream * Name Cathy

In diesem Befehl ist XADD der Redis-Befehl, mystream ist der Name des Streams, Anna, Bert und Cathy sind die Namen, die in jeder Zeile hinzugefügt werden, und der Operator * weist Redis an, die Kennung für jede Zeile automatisch zu generieren. Dieser Befehl führt zu drei mystream-Einträgen:

1518951481323-0 Name Cathy

1518951480723-0 Name Bert

1518951480106-0 Name Anna

Hinzufügen von Daten mit benutzerverwalteten IDs für jeden Eintrag

Redis bietet Ihnen die Möglichkeit, für jeden Eintrag eine eigene Kennung zu pflegen (siehe unten). Während dies in einigen Fällen nützlich sein kann, ist es normalerweise einfacher, sich auf automatisch generierte IDs zu verlassen.

XADD mystream 10000000 Name Anna

XADD mystream 10000001 Name Bert

XADD mystream 10000002 Name Cathy

Dies führt zu folgenden mystream-Einträgen:

10000002-0 Name Cathy

10000001-0 Name Bert

10000000-0 Name Anna

Hinzufügen von Daten mit einer Höchstgrenze

Sie können Ihren Stream mit einer maximalen Anzahl von Einträgen begrenzen:

XADD mystream MAXLEN 1000000 * Name Anna

XADD mystream MAXLEN 1000000 * Name Bert

XADD mystream MAXLEN 1000000 * Name Cathy

Dieser Befehl entfernt ältere Einträge, wenn der Stream eine Länge von etwa 1.000.000 erreicht.

Ein Tipp: Redis Streams speichert Daten in den Makroknoten eines Radix-Baums. Jeder Makroknoten verfügt über einige Datenelemente (normalerweise im Bereich von einigen zehn). Durch Hinzufügen eines ungefähren MAXLEN-Werts, wie unten gezeigt, muss der Makroknoten nicht für jede Einfügung bearbeitet werden. Wenn einige zehn Zahlen - z. B. 1000000 oder 1000050 - für Sie keinen Unterschied machen, können Sie Ihre Leistung optimieren, indem Sie den Befehl mit dem Approximationszeichen (~) aufrufen.

XADD mystream MAXLEN ~ 1000000 * Name Anna

XADD mystream MAXLEN ~ 1000000 * Name Bert

XADD mystream MAXLEN ~ 1000000 * Name Cathy

Verbrauchen Sie Daten aus einem Stream mit Redis Streams

Die Redis Streams-Struktur bietet eine Vielzahl von Befehlen und Funktionen, mit denen Sie Ihre Daten auf verschiedene Weise nutzen können.

Lesen Sie alles vom Anfang des Streams

Situation: Der Stream verfügt bereits über die Daten, die Sie verarbeiten müssen, und Sie möchten alles von Anfang an verarbeiten.

Der Befehl, den Sie hierfür verwenden, ist XREAD, mit dem Sie alle oder die ersten N Einträge vom Anfang des Streams lesen können. Als bewährte Methode ist es immer eine gute Idee, die Daten Seite für Seite zu lesen. Um bis zu 100 Einträge vom Anfang des Streams zu lesen, lautet der Befehl:

XREAD COUNT 100 STREAMS mystream 0

Angenommen, 1518951481323-0 ist die letzte ID des Elements, das Sie im vorherigen Befehl erhalten haben, können Sie die nächsten 100 Einträge abrufen, indem Sie Folgendes ausführen:

XREAD COUNT 100 STREAMS mystream 1518951481323-1

Daten asynchron verbrauchen (über einen blockierenden Aufruf)

Situation: Ihr Verbraucher verbraucht und verarbeitet Daten schneller als die Rate, mit der Daten zum Stream hinzugefügt werden.

Es gibt viele Anwendungsfälle, in denen der Verbraucher schneller liest als die Hersteller Ihrem Stream Daten hinzufügen. In diesen Szenarien soll der Verbraucher warten und benachrichtigt werden, wenn neue Daten eintreffen. Mit der Option BLOCK können Sie festlegen, wie lange auf neue Daten gewartet werden soll: 

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

Hier gibt XREAD alle Daten nach 1518951123456-1 zurück. Wenn danach keine Daten mehr vorhanden sind, wartet die Abfrage N = 60 Sekunden, bis neue Daten eintreffen, und läuft dann ab. Wenn Sie diesen Befehl unendlich blockieren möchten, rufen Sie XREAD wie folgt auf:

XREAD BLOCK 0 STREAMS mystream 1518951123456-1 

Hinweis : In diesem Beispiel können Sie Daten auch Seite für Seite mit dem Befehl XRANGE abrufen. 

Lesen Sie nur neue Daten, sobald sie eintreffen

Situation: Sie möchten nur den neuen Datensatz ab dem aktuellen Zeitpunkt verarbeiten.

Wenn Sie Daten wiederholt lesen, ist es immer eine gute Idee, dort neu zu starten, wo Sie aufgehört haben. Im vorherigen Beispiel haben Sie beispielsweise einen Sperraufruf zum Lesen von Daten ausgeführt, die größer als 1518951123456-1 sind. Zunächst kennen Sie jedoch möglicherweise nicht die neueste ID. In solchen Fällen können Sie den Stream mit dem $ -Zeichen lesen, das den XREAD-Befehl anweist, nur neue Daten abzurufen. Da dieser Aufruf die Option BLOCK mit 60 Sekunden verwendet, wartet er, bis sich einige Daten im Stream befinden.

XREAD BLOCK 60000 STREAMS mystream $

In diesem Fall lesen Sie neue Daten mit der Option $. Sie sollten jedoch keine nachfolgenden Anrufe mit der Option $ tätigen. Wenn beispielsweise 1518951123456-0 die ID der Daten ist, die in früheren Anrufen abgerufen wurden, sollte Ihr nächster Anruf sein:

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

Iterieren Sie den Stream, um vergangene Daten zu lesen

Situation: Ihr Datenstrom verfügt bereits über genügend Daten und Sie möchten ihn abfragen, um die bisher gesammelten Daten zu analysieren.

Sie können die Daten zwischen zwei Einträgen entweder in Vorwärts- oder Rückwärtsrichtung mit XRANGE bzw. XREVRANGE lesen. In diesem Beispiel liest der Befehl Daten zwischen 1518951123450-0 und 1518951123460-0:

XRANGE mystream 1518951123450-0 1518951123460-0

Mit XRANGE können Sie auch die Anzahl der zurückgegebenen Artikel mithilfe der Option COUNT begrenzen. Die folgende Abfrage gibt beispielsweise die ersten 10 Elemente zwischen den beiden Intervallen zurück. Mit dieser Option können Sie einen Stream wie mit dem SCAN-Befehl durchlaufen:

XRANGE mystream 1518951123450-0 1518951123460-0 COUNT 10

Wenn Sie die Unter- oder Obergrenze Ihrer Abfrage nicht kennen, können Sie die Untergrenze durch - und die Obergrenze durch + ersetzen. Die folgende Abfrage gibt beispielsweise die ersten 10 Elemente vom Anfang Ihres Streams zurück:

XRANGE mystream - + COUNT 10

Die Syntax für XREVRANGE ähnelt XRANGE, außer dass Sie die Reihenfolge Ihrer unteren und oberen Grenzen umkehren. Die folgende Abfrage gibt beispielsweise die ersten 10 Elemente vom Ende Ihres Streams in umgekehrter Reihenfolge zurück:

XREVRANGE mystream + - COUNT 10

Partitionsdaten zwischen mehr als einem Verbraucher

Situation: Verbraucher verbrauchen Ihre Daten viel langsamer als Hersteller.

In bestimmten Fällen, einschließlich Bildverarbeitung, Deep Learning und Stimmungsanalyse, können Verbraucher im Vergleich zu Produzenten sehr langsam sein. In diesen Fällen passen Sie die Geschwindigkeit der ankommenden Daten an die verbrauchten Daten an, indem Sie Ihre Verbraucher auffächern und die von jedem verbrauchten Daten partitionieren.

Mit Redis Streams können Sie Verbrauchergruppen verwenden, um dies zu erreichen. Wenn mehr als ein Verbraucher Teil einer Gruppe ist, stellt Redis Streams sicher, dass jeder Verbraucher einen exklusiven Datensatz erhält.

XREADGROUP GROUP mygroup consumer1 COUNT 2 STREAMS mystream>

Natürlich gibt es noch viel mehr darüber zu lernen, wie Verbrauchergruppen funktionieren. Redis Streams-Verbrauchergruppen dienen zum Partitionieren von Daten, zur Wiederherstellung nach Katastrophen und zur Gewährleistung der Sicherheit von Transaktionsdaten. All dies werde ich in meinem nächsten Artikel hier erklären.

Wie Sie sehen, ist es einfach, mit Redis Streams zu beginnen. Laden Sie einfach Redis 5.0 herunter, installieren Sie es und tauchen Sie in das Redis Streams-Tutorial auf der Projektwebsite ein.

Roshan Kumar ist Senior Product Manager bei  Redis Labs . Er verfügt über umfangreiche Erfahrung in der Softwareentwicklung und im Technologiemarketing. Roshan hat bei Hewlett-Packard und vielen erfolgreichen Silicon Valley-Startups gearbeitet, darunter ZillionTV, Salorix, Alopa und ActiveVideo. Als begeisterter Programmierer entwarf und entwickelte er mindzeal.com, eine Online-Plattform, auf der Computerprogrammierkurse für junge Studenten angeboten werden. Roshan hat einen Bachelor-Abschluss in Informatik und einen MBA von der Santa Clara University.

- -

Das New Tech Forum bietet einen Ort, an dem Sie neue Unternehmenstechnologien in beispielloser Tiefe und Breite erkunden und diskutieren können. Die Auswahl ist subjektiv, basierend auf unserer Auswahl der Technologien, die wir für wichtig und für die Leser von größtem Interesse halten. akzeptiert keine Marketingmaterialien zur Veröffentlichung und behält sich das Recht vor, alle eingebrachten Inhalte zu bearbeiten. Senden Sie alle Anfragen an  [email protected] .