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 LabsFigur 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 LabsI 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 LabsFø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 AnnaXADD 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 Cathy1518951480723-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 AnnaXADD mystream 10000001 navn Bert
XADD mystream 10000002 navn Cathy
Dette resulterer i følgende mystream-poster:
10000002-0 hedder Cathy10000001-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 AnnaXADD 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 AnnaXADD 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].