Programmering

Hvordan bruke Redis Streams

Roshan Kumar er senior produktsjef i Redis Labs.

Redis, multimodelldatabasen i minnet, er populær i mange brukssaker. Disse inkluderer innholdsbufring, sesjonsbutikker, sanntidsanalyse, meldingsmegling og datastreaming. I fjor skrev jeg om hvordan du bruker Redis Pub / Sub, Lists og Sorted Sets for sanntids strømbehandling. Nå, med ankomsten av Redis 5.0, har Redis en helt ny datastruktur designet for å administrere strømmer.

Med Redis Streams-datastrukturen kan du gjøre mye mer enn det som var mulig med Pub / Sub, Lister og Sorted Sets. Blant de mange fordelene lar Redis Streams deg gjøre følgende:

  • Samle inn store mengder data som kommer i høy hastighet (den eneste flaskehalsen er nettverkets I / O);
  • Lag en datakanal mellom mange produsenter og mange forbrukere;
  • Administrer effektivt forbruket av data selv når produsenter og forbrukere ikke opererer i samme hastighet;
  • Hold ut data når forbrukerne er frakoblet eller koblet fra;
  • Kommunisere mellom produsenter og forbrukere asynkront;
  • Skal antall forbrukere;
  • Implementere transaksjonslignende datasikkerhet når forbrukere mislykkes midt i forbruket av data; og
  • Bruk hovedminnet effektivt.

Den beste delen av Redis Streams er at den er innebygd i Redis, så det kreves ingen ekstra trinn for å distribuere eller administrere Redis Streams. I denne artikkelen vil jeg gå gjennom det grunnleggende om å bruke Redis Streams. Vi vil se på hvordan vi kan legge til data i en strøm, og hvordan vi kan lese dataene (samtidig, asynkront, når de kommer osv.) For å tilfredsstille forskjellige forbrukersaker.

I to fremtidige artikler her vil jeg diskutere hvordan Redis Streams forbrukergrupper fungerer, og jeg vil vise en arbeidsapplikasjon som bruker Redis Streams.

Forstå dataflyten i Redis Streams

Redis Streams gir en "bare legge til" datastruktur som ser ut som logger. Den tilbyr kommandoer som lar deg legge til kilder i strømmer, konsumere strømmer og overvåke og administrere hvordan data forbrukes. Streams-datastrukturen er fleksibel, slik at du kan koble produsenter og forbrukere på flere måter.

Redis Labs

Figur 1 viser den grunnleggende bruken av Redis Streams. En enkelt produsent fungerer som datakilde, og forbrukeren er en meldingsapplikasjon som sender data til de aktuelle mottakerne.

Redis Labs

I figur 2 forbrukes en felles datastrøm av mer enn én forbruker. Med Redis Streams kan forbrukerne lese og analysere dataene i sitt eget tempo.

I neste applikasjon, vist i figur 3, blir ting litt mer komplekse. Denne tjenesten mottar data fra flere produsenter, og lagrer alt i en Redis Streams-datastruktur. Applikasjonen har flere forbrukere som leser dataene fra Redis Streams, samt en forbrukergruppe som støtter forbrukere som ikke kan operere i samme hastighet som produsentene.

Redis Labs

Legg til data i en strøm med Redis Streams

Diagrammet i figur 3 viser bare en måte å legge til data til en Redis Stream. Selv om en eller flere produsenter kan legge til data i datastrukturen, legges det alltid til nye data til slutten av strømmen.

Standardmetoden for å legge til data

Dette er den enkleste måten å legge til data i Redis Streams:

XADD mystream * navn Anna

XADD mystream * navn Bert

XADD mystream * navn Cathy

I denne kommandoen er XADD Redis-kommandoen, mystream er navnet på strømmen, Anna, Bert og Cathy er navnene som er lagt til i hver linje, og * -operatøren ber Redis om å automatisk generere identifikatoren for hver linje. Denne kommandoen resulterer i tre mystream-oppføringer:

1518951481323-0 navn Cathy

1518951480723-0 navn Bert

1518951480106-0 navn Anna

Legge til data med brukerstyrte ID-er for hver oppføring

Redis gir deg muligheten til å opprettholde din egen identifikator for hver oppføring (se nedenfor). Selv om dette i noen tilfeller kan være nyttig, er det vanligvis enklere å stole på automatisk genererte ID-er.

XADD mystream 10000000 navn Anna

XADD mystream 10000001 navn Bert

XADD mystream 10000002 navn Cathy

Dette resulterer i følgende mystream-oppføringer:

10000002-0 heter Cathy

10000001-0 navn Bert

10000000-0 heter Anna

Legge til data med maksimumsgrense

Du kan begrense strømmen din med maksimalt antall oppføringer:

XADD mystream MAXLEN 1000000 * navn Anna

XADD mystream MAXLEN 1000000 * navn Bert

XADD mystream MAXLEN 1000000 * navn Cathy

Denne kommandoen kaster ut eldre oppføringer når strømmen når en lengde på rundt 1 000 000.

Et tips: Redis Streams lagrer data i makronodene til et radix-tre. Hver makroknute har noen få dataelementer (vanligvis i området noen titalls). Hvis du legger til en omtrentlig MAXLEN-verdi som vist nedenfor, unngås å måtte manipulere makronoden for hver innsetting. Hvis noen titalls tall - f.eks. 1000000 eller 1000050 - gjør liten forskjell for deg, kan du optimalisere ytelsen din ved å ringe kommandoen med tilnærmingstegn (~).

XADD mystream MAXLEN ~ 1000000 * navn Anna

XADD mystream MAXLEN ~ 1000000 * navn Bert

XADD mystream MAXLEN ~ 1000000 * navn Cathy

Bruk data fra en strøm med Redis Streams

Redis Streams-strukturen tilbyr et rikt sett med kommandoer og funksjoner for å konsumere dataene dine på en rekke måter.

Les alt fra begynnelsen av strømmen

Situasjon: Strømmen har allerede dataene du trenger å behandle, og du vil behandle alt fra begynnelsen.

Kommandoen du vil bruke til dette er XREAD, som lar deg lese alle eller de første N-oppføringene fra begynnelsen av strømmen. Som en god praksis er det alltid en god ide å lese dataene side for side. For å lese opptil 100 oppføringer fra begynnelsen av strømmen, er kommandoen:

XREAD COUNT 100 STREAMS mystream 0

Forutsatt at 1518951481323-0 er den siste ID-en for elementet du mottok i forrige kommando, kan du hente de neste 100 oppføringene ved å kjøre:

XREAD COUNT 100 STREAMS mystream 1518951481323-1

Bruk data asynkront (via en blokkeringsanrop)

Situasjon: Forbrukeren forbruker og behandler data raskere enn den hastigheten data blir lagt til i strømmen.

Det er mange brukstilfeller der forbrukeren leser raskere enn produsentene legger til data i strømmen din. I disse scenariene vil du at forbrukeren skal vente og bli varslet når nye data kommer. BLOCK-alternativet lar deg spesifisere hvor lang tid det skal vente på nye data: 

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

Her returnerer XREAD alle dataene etter 1518951123456-1. Hvis det ikke er noen data etter det, vil spørringen vente på N = 60 sekunder til fersk data kommer, og deretter ta en pause. Hvis du vil blokkere denne kommandoen uendelig, kan du ringe XREAD som følger:

XREAD BLOCK 0 STREAMS mystream 1518951123456-1 

Merk: I dette eksemplet kan du også hente data side for side ved hjelp av XRANGE-kommandoen. 

Les bare nye data når de kommer

Situasjon: Du er interessert i å behandle bare det nye datasettet fra det nåværende tidspunktet.

Når du leser data gjentatte ganger, er det alltid lurt å starte på nytt der du slapp. For eksempel, i forrige eksempel, ringte du for å lese data større enn 1518951123456-1. Men til å begynne med vet du kanskje ikke den nyeste ID-en. I slike tilfeller kan du begynne å lese strømmen med $ -tegnet, som forteller XREAD-kommandoen å hente bare nye data. Ettersom denne samtalen bruker BLOCK-alternativet i 60 sekunder, vil den vente til det er noen data i strømmen.

XREAD BLOCK 60000 STREAMS mystream $

I dette tilfellet begynner du å lese nye data med $ -alternativet. Du bør imidlertid ikke ringe påfølgende med $ -alternativet. For eksempel, hvis 1518951123456-0 er ID-en for dataene som ble hentet i tidligere samtaler, bør din neste samtale være:

XREAD BLOCK 60000 STREAMS mystream 1518951123456-1

Iterer strømmen for å lese tidligere data

Situasjon: Datastrømmen din har allerede nok data, og du vil spørre den for å analysere data som er samlet inn så langt.

Du kan lese dataene mellom to oppføringer enten i fremover eller bakover ved å bruke henholdsvis XRANGE og XREVRANGE. I dette eksemplet leser kommandoen data mellom 1518951123450-0 og 1518951123460-0:

XRANGE mystream 1518951123450-0 1518951123460-0

XRANGE lar deg også begrense antall varer som returneres ved hjelp av COUNT-alternativet. For eksempel returnerer følgende spørsmål de første 10 elementene mellom de to intervallene. Med dette alternativet kan du gjenta gjennom en strøm som du gjør med SCAN-kommandoen:

XRANGE mystream 1518951123450-0 1518951123460-0 TELLING 10

Når du ikke kjenner nedre eller øvre grense for spørringen, kan du erstatte den nedre grensen med - og den øvre grensen med +. For eksempel returnerer følgende spørsmål de første 10 elementene fra begynnelsen av strømmen din:

XRANGE mystream - + COUNT 10

Syntaksen for XREVRANGE ligner XRANGE, bortsett fra at du reverserer rekkefølgen på nedre og øvre grenser. For eksempel returnerer følgende spørring de ti første elementene fra slutten av strømmen din i omvendt rekkefølge:

XREVRANGE mystream + - COUNT 10

Partisjonsdata blant mer enn en forbruker

Situasjon: Forbrukere bruker dataene dine langt tregere enn produsentene produserer.

I visse tilfeller, inkludert bildebehandling, dyp læring og sentimentanalyse, kan forbrukerne være veldig treg sammenlignet med produsenter. I disse tilfellene samsvarer du med hastigheten på dataene som kommer til dataene som forbrukes ved å vifte ut forbrukerne og dele dataene som forbrukes av hver enkelt.

Med Redis Streams kan du bruke forbrukergrupper for å oppnå dette. Når mer enn én forbruker er en del av en gruppe, vil Redis Streams sikre at hver forbruker mottar et eksklusivt datasett.

XREADGROUP GROUP mygroup forbruker1 TELL 2 STREAMS mystream>

Selvfølgelig er det mye mer å lære om hvordan forbrukergrupper fungerer. Redis Streams forbrukergrupper er designet for å partisjonere data, komme seg fra katastrofer og levere sikkerhetsdata for transaksjonsdata. Jeg forklarer alt dette i min neste artikkel her.

Som du kan se, er det enkelt å komme i gang med Redis Streams. Bare last ned og installer Redis 5.0 og dykk inn i Redis Streams-opplæringen på prosjektnettstedet.

Roshan Kumar er senior produktsjef iRedis Labs. Han har lang erfaring innen programvareutvikling og teknologimarkedsføring. Roshan har jobbet i Hewlett-Packard og mange vellykkede oppstartsbedrifter i Silicon Valley, inkludert ZillionTV, Salorix, Alopa og ActiveVideo. Som en entusiastisk programmerer designet og utviklet han mindzeal.com, en online plattform som er vert for dataprogrammeringskurs for unge studenter. Roshan har en bachelorgrad i informatikk og en MBA fra Santa Clara University.

New Tech Forum er et sted for å utforske og diskutere ny teknologi i enestående dybde og bredde. Valget er subjektivt, basert på vårt valg av teknologiene vi mener er viktige og av størst interesse for leserne. godtar ikke markedsføringssikkerhet for publisering og forbeholder seg retten til å redigere alt bidratt innhold. Send alle henvendelser til[email protected].