Come utilizzare Redis Streams

Roshan Kumar è un senior product manager presso Redis Labs.

Redis, il database multimodello in memoria, è popolare per molti casi d'uso. Questi includono la cache dei contenuti, archivi di sessioni, analisi in tempo reale, intermediazione di messaggi e streaming di dati. L'anno scorso ho scritto su come utilizzare Redis Pub / Sub, Lists e Sorted Sets per l'elaborazione del flusso in tempo reale. Ora, con l'arrivo di Redis 5.0, Redis dispone di una nuovissima struttura dati progettata per la gestione dei flussi.

Con la struttura dei dati Redis Streams, puoi fare molto di più di quanto possibile con Pub / Sub, Lists e Sorted Sets. Tra i tanti vantaggi, Redis Streams ti consente di fare quanto segue:

  • Raccogli grandi volumi di dati che arrivano ad alta velocità (l'unico collo di bottiglia è l'I / O di rete);
  • Creare un canale dati tra molti produttori e molti consumatori;
  • Gestisci efficacemente il consumo di dati anche quando produttori e consumatori non operano alla stessa velocità;
  • Persistere i dati quando i tuoi consumatori sono offline o disconnessi;
  • Comunicare tra produttori e consumatori in modo asincrono;
  • Scala il tuo numero di consumatori;
  • Implementare la sicurezza dei dati simile alle transazioni quando i consumatori non riescono a consumare dati; e
  • Usa la tua memoria principale in modo efficiente.

La parte migliore di Redis Streams è che è integrato in Redis, quindi non sono necessari passaggi aggiuntivi per distribuire o gestire Redis Streams. In questo articolo, ti guiderò attraverso le basi dell'utilizzo di Redis Streams. Vedremo come aggiungere dati a un flusso e come leggere quei dati (tutti in una volta, in modo asincrono, non appena arrivano, ecc.) Per soddisfare i diversi casi d'uso dei consumatori.

In due articoli futuri qui, parlerò di come funzionano i gruppi di consumatori di Redis Streams e mostrerò un'applicazione funzionante che utilizza Redis Streams.

Comprendere il flusso di dati in Redis Streams

Redis Streams fornisce una struttura di dati "solo aggiunta" che appare simile ai log. Offre comandi che consentono di aggiungere sorgenti ai flussi, consumare flussi e monitorare e gestire il modo in cui i dati vengono consumati. La struttura dei dati Streams è flessibile e consente di connettere produttori e consumatori in diversi modi.

Redis Labs

La figura 1 mostra l'utilizzo di base di Redis Streams. Un singolo produttore funge da origine dati e il relativo consumatore è un'applicazione di messaggistica che invia dati ai destinatari pertinenti.

Redis Labs

Nella Figura 2, un flusso di dati comune viene utilizzato da più di un consumatore. Con Redis Streams, i consumatori possono leggere e analizzare i dati al proprio ritmo.

Nella prossima applicazione, mostrata nella Figura 3, le cose diventano un po 'più complesse. Questo servizio riceve dati da più produttori e li archivia tutti in una struttura dati Redis Streams. L'applicazione ha più consumatori che leggono i dati da Redis Streams, nonché un gruppo di consumatori, che supporta i consumatori che non possono operare alla stessa velocità dei produttori.

Redis Labs

Aggiungi dati a uno stream con Redis Streams

Il diagramma nella Figura 3 mostra solo un modo per aggiungere dati a un flusso Redis. Sebbene uno o più produttori possano aggiungere dati alla struttura dati, tutti i nuovi dati vengono sempre aggiunti alla fine del flusso.

Il metodo predefinito per l'aggiunta di dati

Questo è il modo più semplice per aggiungere dati in Redis Streams:

XADD mystream * nome Anna

XADD mystream * nome Bert

XADD mystream * nome Cathy

In questo comando, XADD è il comando Redis, mystream è il nome dello stream, Anna, Bert e Cathy sono i nomi aggiunti in ogni riga e l'operatore * dice a Redis di generare automaticamente l'identificatore per ogni riga. Questo comando produce tre voci mystream:

1518951481323-0 nome Cathy

1518951480723-0 nome Bert

1518951480106-0 nome Anna

Aggiunta di dati con ID gestiti dall'utente per ogni voce

Redis ti offre un'opzione per mantenere il tuo identificatore per ogni voce (vedi sotto). Sebbene ciò possa essere utile in alcuni casi, di solito è più semplice fare affidamento su ID generati automaticamente.

XADD mystream 10000000 nome Anna

XADD mystream 10000001 nome Bert

XADD mystream 10000002 nome Cathy

Ciò si traduce nelle seguenti voci mystream:

10000002-0 nome Cathy

10000001-0 nome Bert

10000000-0 nome Anna

Aggiunta di dati con un limite massimo

Puoi limitare il tuo stream con un numero massimo di voci:

XADD mystream MAXLEN 1000000 * nome Anna

XADD mystream MAXLEN 1000000 * nome Bert

XADD mystream MAXLEN 1000000 * nome Cathy

Questo comando elimina le voci meno recenti quando il flusso raggiunge una lunghezza di circa 1.000.000.

Un suggerimento: Redis Streams memorizza i dati nei nodi macro di un albero radice. Ogni macro nodo ha pochi elementi di dati (tipicamente, nell'intervallo di poche decine). L'aggiunta di un valore MAXLEN approssimativo come mostrato di seguito evita di dover manipolare il nodo macro per ogni inserimento. Se poche decine di numeri, ad esempio 1000000 o 1000050, fanno poca differenza per te, puoi ottimizzare le tue prestazioni chiamando il comando con il carattere di approssimazione (~).

XADD mystream MAXLEN ~ 1000000 * nome Anna

XADD mystream MAXLEN ~ 1000000 * nome Bert

XADD mystream MAXLEN ~ 1000000 * nome Cathy

Consuma dati da un flusso con Redis Streams

La struttura Redis Streams offre un ricco set di comandi e funzionalità per utilizzare i dati in vari modi.

Leggi tutto dall'inizio dello stream

Situazione: il flusso contiene già i dati che devi elaborare e desideri elaborarli tutti dall'inizio.

Il comando che utilizzerai per questo è XREAD, che ti consente di leggere tutte o le prime N voci dall'inizio del flusso. Come best practice, è sempre una buona idea leggere i dati pagina per pagina. Per leggere fino a 100 voci dall'inizio del flusso, il comando è:

XREAD COUNT 100 STREAMS mystream 0

Supponendo che 1518951481323-0 sia l'ultimo ID dell'articolo ricevuto nel comando precedente, puoi recuperare le 100 voci successive eseguendo:

XREAD COUNT 100 STREAMS mystream 1518951481323-1

Consuma i dati in modo asincrono (tramite una chiamata di blocco)

Situazione: il tuo consumatore consuma ed elabora i dati più velocemente della velocità con cui i dati vengono aggiunti al flusso.

Ci sono molti casi d'uso in cui il consumatore legge più velocemente di quanto i produttori aggiungano dati al tuo flusso. In questi scenari, si desidera che il consumatore attenda e riceva una notifica quando arrivano nuovi dati. L'opzione BLOCCO consente di specificare il tempo di attesa per i nuovi dati: 

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

Qui, XREAD restituisce tutti i dati dopo 1518951123456-1. Se non ci sono dati dopo, la query attenderà N = 60 secondi fino all'arrivo di nuovi dati, quindi il timeout. Se vuoi bloccare questo comando all'infinito, chiama XREAD come segue:

XREAD BLOCK 0 STREAMS mystream 1518951123456-1 

Nota : in questo esempio, è anche possibile recuperare i dati pagina per pagina utilizzando il comando XRANGE. 

Legge solo i nuovi dati non appena arrivano

Situazione: sei interessato a elaborare solo il nuovo set di dati a partire dal momento corrente.

Quando si leggono ripetutamente i dati, è sempre una buona idea ricominciare da dove si era interrotto. Ad esempio, nell'esempio precedente, hai effettuato una chiamata di blocco per leggere dati maggiori di 1518951123456-1. Tuttavia, per cominciare, potresti non conoscere l'ultimo ID. In questi casi, puoi iniziare a leggere il flusso con il segno $, che indica al comando XREAD di recuperare solo i nuovi dati. Poiché questa chiamata utilizza l'opzione BLOCK con 60 secondi, attenderà fino a quando non saranno presenti alcuni dati nel flusso.

XREAD BLOCK 60000 STREAMS mystream $

In questo caso, inizierai a leggere nuovi dati con l'opzione $. Tuttavia, non dovresti effettuare chiamate successive con l'opzione $. Ad esempio, se 1518951123456-0 è l'ID dei dati recuperati nelle chiamate precedenti, la chiamata successiva dovrebbe essere:

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

Ripeti il ​​flusso per leggere i dati precedenti

Situazione: il tuo flusso di dati ha già dati sufficienti e desideri interrogarlo per analizzare i dati raccolti finora.

È possibile leggere i dati tra due voci in avanti o indietro utilizzando rispettivamente XRANGE e XREVRANGE. In questo esempio, il comando legge i dati tra 1518951123450-0 e 1518951123460-0:

XRANGE mystream 1518951123450-0 1518951123460-0

XRANGE consente anche di limitare il numero di articoli restituiti con l'aiuto dell'opzione COUNT. Ad esempio, la seguente query restituisce i primi 10 elementi tra i due intervalli. Con questa opzione, puoi scorrere un flusso come fai con il comando SCAN:

XRANGE mystream 1518951123450-0 1518951123460-0 COUNT 10

Quando non conosci il limite inferiore o superiore della query, puoi sostituire il limite inferiore con - e il limite superiore con +. Ad esempio, la seguente query restituisce i primi 10 elementi dall'inizio del tuo flusso:

XRANGE mystream - + COUNT 10

La sintassi per XREVRANGE è simile a XRANGE, tranne per il fatto che si inverte l'ordine dei limiti inferiore e superiore. Ad esempio, la seguente query restituisce i primi 10 elementi dalla fine del flusso in ordine inverso:

XREVRANGE mystream + - COUNT 10

Partizione dei dati tra più di un consumatore

Situazione: i consumatori consumano i tuoi dati molto più lentamente di quanto i produttori li producano.

In alcuni casi, inclusi l'elaborazione delle immagini, l'apprendimento approfondito e l'analisi del sentiment, i consumatori possono essere molto lenti rispetto ai produttori. In questi casi, fai corrispondere la velocità dei dati in arrivo ai dati consumati aprendo i tuoi consumatori e partizionando i dati consumati da ciascuno.

Con Redis Streams, puoi utilizzare gruppi di consumatori per eseguire questa operazione. Quando più di un consumatore fa parte di un gruppo, Redis Streams garantirà che ogni consumatore riceva un set esclusivo di dati.

XREADGROUP GROUP mygroup consumer1 COUNT 2 STREAMS mystream>

Naturalmente, c'è molto altro da imparare su come funzionano i gruppi di consumatori. I gruppi di consumatori Redis Streams sono progettati per partizionare i dati, recuperare da disastri e garantire la sicurezza dei dati delle transazioni. Spiegherò tutto questo nel mio prossimo articolo qui.

Come puoi vedere, è facile iniziare con Redis Streams. Basta scaricare e installare Redis 5.0 e immergersi nel tutorial Redis Streams sul sito Web del progetto.

Roshan Kumar è un senior product manager presso  Redis Labs . Ha una vasta esperienza nello sviluppo di software e nel marketing tecnologico. Roshan ha lavorato presso Hewlett-Packard e molte startup di successo della Silicon Valley, tra cui ZillionTV, Salorix, Alopa e ActiveVideo. In qualità di programmatore entusiasta, ha progettato e sviluppato mindzeal.com, una piattaforma online che ospita corsi di programmazione informatica per giovani studenti. Roshan ha conseguito una laurea in informatica e un MBA presso la Santa Clara University.

-

Il New Tech Forum offre un luogo per esplorare e discutere la tecnologia aziendale emergente in profondità e ampiezza senza precedenti. La selezione è soggettiva, in base alla nostra scelta delle tecnologie che riteniamo importanti e di maggiore interesse per i lettori. non accetta materiale di marketing per la pubblicazione e si riserva il diritto di modificare tutti i contenuti forniti. Invia tutte le richieste a  [email protected] .