Programmering

Sådan bruges Redis Streams

Roshan Kumar er senior produktchef hos Redis Labs.

Redis, multimodeldatabasen i hukommelsen, er populær i mange brugssager. Disse inkluderer caching af indhold, sessionsbutikker, realtidsanalyse, meddelelsesmægling og datastreaming. Sidste år skrev jeg om, hvordan man bruger Redis Pub / Sub, Lists og Sorted Sets til realtids streambehandling. Nu, med ankomsten af ​​Redis 5.0, har Redis en splinterny datastruktur designet til at styre streams.

Med Redis Streams-datastrukturen kan du gøre meget mere, end hvad der var muligt med pub / sub, lister og sorterede sæt. Blandt de mange fordele giver Redis Streams dig mulighed for at gøre følgende:

  • Saml store mængder data, der ankommer i høj hastighed (den eneste flaskehals er dit netværks I / O);
  • Opret en datakanal mellem mange producenter og mange forbrugere;
  • Administrer effektivt dit forbrug af data, selv når producenter og forbrugere ikke fungerer i samme hastighed;
  • Vedvar data, når dine forbrugere er offline eller afbrudt;
  • Kommunikere mellem producenter og forbrugere asynkront;
  • Skaler dit antal forbrugere;
  • Implementere transaktionslignende datasikkerhed, når forbrugere fejler midt i forbruget af data; og
  • Brug din hovedhukommelse effektivt.

Den bedste del af Redis Streams er, at den er indbygget i Redis, så der kræves ingen ekstra trin for at implementere eller administrere Redis Streams. I denne artikel leder jeg dig gennem det grundlæggende ved at bruge Redis Streams. Vi ser på, hvordan vi kan føje data til en stream, og hvordan vi kan læse disse data (alt på én gang, asynkront, når de ankommer osv.) For at tilfredsstille forskellige forbrugersituationer.

I to fremtidige artikler her vil jeg diskutere, hvordan Redis Streams 'forbrugergrupper fungerer, og jeg vil vise en arbejdsapplikation, der bruger Redis Streams.

Forstå datastrømmen i Redis Streams

Redis Streams giver en "kun tilføj" -datastruktur, der ligner logfiler. Det tilbyder kommandoer, der giver dig mulighed for at tilføje kilder til streams, forbruge streams og overvåge og styre, hvordan data forbruges. Streams-datastrukturen er fleksibel, så du kan forbinde producenter og forbrugere på flere måder.

Redis Labs

Figur 1 viser den grundlæggende anvendelse af Redis Streams. En enkelt producent fungerer som datakilde, og dens forbruger er en messaging-applikation, der sender data til de relevante modtagere.

Redis Labs

I figur 2 forbruges en fælles datastrøm af mere end en forbruger. Med Redis Streams kan forbrugerne læse og analysere dataene i deres eget tempo.

I den næste applikation, vist i figur 3, bliver tingene lidt mere komplekse. Denne tjeneste modtager data fra flere producenter og gemmer det hele i en Redis Streams-datastruktur. Applikationen har flere forbrugere, der læser data fra Redis Streams, samt en forbrugergruppe, der understøtter forbrugere, der ikke kan operere i samme hastighed som producenterne.

Redis Labs

Føj data til en stream med Redis Streams

Diagrammet i figur 3 viser kun en måde at føje data til en Redis Stream på. Selvom en eller flere producenter kan tilføje data til datastrukturen, tilføjes nye data altid i slutningen af ​​strømmen.

Standardmetoden til tilføjelse af data

Dette er den enkleste måde at tilføje data til Redis Streams på:

XADD mystream * navn Anna

XADD mystream * navn Bert

XADD mystream * navn Cathy

I denne kommando er XADD Redis-kommandoen, mystream er navnet på strømmen, Anna, Bert og Cathy er de navne, der tilføjes i hver linje, og * -operatøren beder Redis om automatisk at generere identifikatoren for hver linje. Denne kommando resulterer i tre mystream-poster:

1518951481323-0 hedder Cathy

1518951480723-0 navn Bert

1518951480106-0 hedder Anna

Tilføjelse af data med brugerstyrede id'er for hver post

Redis giver dig mulighed for at opretholde din egen identifikator for hver post (se nedenfor). Selv om dette i nogle tilfælde kan være nyttigt, er det normalt enklere at stole på automatisk genererede id'er.

XADD mystream 10000000 navn Anna

XADD mystream 10000001 navn Bert

XADD mystream 10000002 navn Cathy

Dette resulterer i følgende mystream-poster:

10000002-0 hedder Cathy

10000001-0 navn Bert

10000000-0 navn Anna

Tilføjelse af data med en maksimal grænse

Du kan dække din stream med et maksimalt antal poster:

XADD mystream MAXLEN 1000000 * navn Anna

XADD mystream MAXLEN 1000000 * navn Bert

XADD mystream MAXLEN 1000000 * navn Cathy

Denne kommando udsætter ældre poster, når strømmen når en længde på omkring 1.000.000.

Et tip: Redis Streams gemmer data i et radix-træets makroknudepunkter. Hver makroknude har et par dataelementer (typisk inden for et par tiere). Tilføjelse af en omtrentlig MAXLEN-værdi som vist nedenfor undgår at skulle manipulere makroknudepunktet for hver indsættelse. Hvis et par snesevis af tal - f.eks. Om 1000000 eller 1000050 - gør lille forskel for dig, kan du optimere din præstation ved at kalde kommandoen med tilnærmelsestegnet (~).

XADD mystream MAXLEN ~ 1000000 * navn Anna

XADD mystream MAXLEN ~ 1000000 * navn Bert

XADD mystream MAXLEN ~ 1000000 * navn Cathy

Forbrug data fra en stream med Redis Streams

Redis Streams-strukturen tilbyder et rigt sæt kommandoer og funktioner til at forbruge dine data på en række forskellige måder.

Læs alt fra starten af ​​strømmen

Situation: Strømmen har allerede de data, du skal behandle, og du vil behandle det hele fra starten.

Den kommando, du bruger til dette, er XREAD, som giver dig mulighed for at læse alle eller de første N-poster fra begyndelsen af ​​streamen. Som en bedste praksis er det altid en god ide at læse dataene side for side. For at læse op til 100 poster fra begyndelsen af ​​streamen er kommandoen:

XREAD COUNT 100 STREAMS mystream 0

Forudsat at 1518951481323-0 er det sidste ID for det element, du modtog i den forrige kommando, kan du hente de næste 100 poster ved at køre:

XREAD COUNT 100 STREAMS mystream 1518951481323-1

Forbrug data asynkront (via et blokerende opkald)

Situation: Din forbruger forbruger og behandler data hurtigere end den hastighed, hvormed data føjes til strømmen.

Der er mange brugssager, hvor forbrugeren læser hurtigere, end producenterne tilføjer data til din stream. I disse scenarier vil du have, at forbrugeren venter og får besked, når der kommer nye data. BLOCK-indstillingen giver dig mulighed for at specificere, hvor lang tid der skal vente på nye data: 

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

Her returnerer XREAD alle data efter 1518951123456-1. Hvis der ikke er nogen data efter det, venter forespørgslen på N = 60 sekunder, indtil der kommer nye data og derefter timeout. Hvis du vil blokere denne kommando uendeligt, skal du ringe til XREAD som følger:

XREAD BLOCK 0 STREAMS mystream 1518951123456-1 

Bemærk: I dette eksempel kan du også hente datasiden for side ved hjælp af kommandoen XRANGE. 

Læs kun nye data, når de ankommer

Situation: Du er kun interesseret i at behandle det nye datasæt med start fra det aktuelle tidspunkt.

Når du læser data gentagne gange, er det altid en god ide at genstarte det sted, hvor du slap. For eksempel foretog du i det foregående eksempel et blokerende opkald for at læse data større end 1518951123456-1. Men til at begynde med kender du muligvis ikke det nyeste ID. I sådanne tilfælde kan du begynde at læse streamen med $ -tegnet, som fortæller XREAD-kommandoen kun at hente nye data. Da dette opkald bruger BLOCK-indstillingen med 60 sekunder, venter den, indtil der er nogle data i strømmen.

XREAD BLOCK 60000 STREAMS mystream $

I dette tilfælde begynder du at læse nye data med indstillingen $. Du bør dog ikke foretage efterfølgende opkald med indstillingen $. For eksempel, hvis 1518951123456-0 er id'et for de data, der er hentet i tidligere opkald, skal dit næste opkald være:

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

Iterer strømmen for at læse tidligere data

Situation: Din datastrøm har allerede nok data, og du vil spørge den for at analysere data, der er indsamlet indtil videre.

Du kunne læse dataene mellem to poster enten i fremad eller bagudgående retning ved hjælp af henholdsvis XRANGE og XREVRANGE. I dette eksempel læser kommandoen data mellem 1518951123450-0 og 1518951123460-0:

XRANGE mystream 1518951123450-0 1518951123460-0

XRANGE giver dig også mulighed for at begrænse antallet af varer, der returneres ved hjælp af COUNT-indstillingen. For eksempel returnerer følgende forespørgsel de første 10 emner mellem de to intervaller. Med denne mulighed kan du gentage gennem en stream, som du gør med SCAN-kommandoen:

XRANGE mystream 1518951123450-0 1518951123460-0 TÆLLING 10

Når du ikke kender den nedre eller øvre grænse for din forespørgsel, kan du erstatte den nedre grænse med - og den øvre grænse med +. For eksempel returnerer følgende forespørgsel de første 10 varer fra starten af ​​din stream:

XRANGE mystream - + COUNT 10

Syntaksen for XREVRANGE svarer til XRANGE, bortset fra at du vender rækkefølgen af ​​dine nedre og øvre grænser. For eksempel returnerer følgende forespørgsel de første 10 varer fra slutningen af ​​din stream i omvendt rækkefølge:

XREVRANGE mystream + - COUNT 10

Opdelingsdata blandt mere end en forbruger

Situation: Forbrugere forbruger dine data langt langsommere, end producenterne producerer dem.

I visse tilfælde, herunder billedbehandling, dyb læring og følelsesanalyse, kan forbrugerne være meget langsomme sammenlignet med producenter. I disse tilfælde matcher du hastigheden på data, der ankommer til de data, der forbruges, ved at blæse dine forbrugere ud og opdele de data, der forbruges af hver enkelt.

Med Redis Streams kan du bruge forbrugergrupper til at opnå dette. Når mere end en forbruger er en del af en gruppe, vil Redis Streams sikre, at enhver forbruger modtager et eksklusivt datasæt.

XREADGROUP GROUP mygroup forbruger1 TÆLL 2 STREAMS mystream>

Der er selvfølgelig meget mere at lære om, hvordan forbrugergrupper fungerer. Redis Streams forbrugergrupper er designet til at partitionere data, komme sig efter katastrofer og levere transaktionsdata sikkerhed. Jeg forklarer alt dette i min næste artikel her.

Som du kan se, er det let at komme i gang med Redis Streams. Bare download og installer Redis 5.0, og dyk ind i Redis Streams-selvstudiet på projektwebstedet.

Roshan Kumar er senior produktchef hosRedis Labs. Han har stor erfaring inden for softwareudvikling og teknologimarkedsføring. Roshan har arbejdet hos Hewlett-Packard og mange succesrige Silicon Valley startups, herunder ZillionTV, Salorix, Alopa og ActiveVideo. Som en entusiastisk programmør designede og udviklede han mindzeal.com, en online platform, der er vært for computerprogrammeringskurser for unge studerende. Roshan har en bachelorgrad i datalogi og en MBA fra Santa Clara University.

New Tech Forum giver et sted at udforske og diskutere nye virksomhedsteknologier i hidtil uset dybde og bredde. Valget er subjektivt baseret på vores valg af de teknologier, som vi mener er vigtige og af største interesse for læserne. accepterer ikke markedsføringssikkerhed til offentliggørelse og forbeholder sig retten til at redigere alt bidraget indhold. Send alle henvendelser til[email protected].