Redis xread

Redis xread

Redis strømmer, forbrukere og blokkering av operasjoner

Redis introduserte strømningene som etterligner loggdatastrukturen med versjon 5.0. Strøm er en datastruktur med bare appendinger med et rikere sett med operasjoner enn i en loggfil. Det er en av de mest komplekse datatypene i Redis siden det implementerer ytterligere blokkeringsoperasjoner som lar klientene vente på de nye strømdataene. Dette ligner noe på oppførselen til Redis Pub/Sub eller Blocking Lists, men grunnleggende forskjeller er der når det gjelder hvordan forbrukerne bruker Redis Stream -dataene.

Som vist i forrige illustrasjon, kan flere fordeler i forhold til Redis Pub/Sub and Blocking Lists sees. Hvert nytt dataelement leveres til alle forbruker. I motsetning til på listene som fjerner listeelementet når det blir kalt til BLPOP eller BRPOP, gjenstår strømelementene som det er i strømmen. Xread-kommandoen fungerer som en blokkering og ikke-blokkerende kandidat på Redis-strømmen.

Xread -kommandoen

Xread -kommandoen kan hente oppføringene fra flere strømmer samtidig mens de returnerte oppføringene har en ID større enn sist mottatt ID for en gitt forbruker. Det kan fungere på både blokkering og ikke-blokkerende måte. I den ikke-blokkerende naturen oppfører kommandoen seg veldig lik Xrange-kommandoen, men med noen tilleggsfunksjoner som er oppført i følgende:

  • Det kan hente oppføringene som starter fra den siste oppføringen som har størst ID enn noe annet element i strømmen.
  • Den kan lese fra flere strømmer samtidig.

Denne kommandoen har en lineær tidskompleksitet når n antall elementer er lagret i strømmen. Derfor, med en fast avkastningstall, er tidskompleksiteten konstant.

Xread -kommandoen følger følgende syntaks:

Syntaks:

Xread [count number_of_returned_elements] [block blocking_time_in_milliseconds] streams tast [tast…] id [id…]

TELLE : Antall elementer som skal returneres av kommandoen. Det begrenser de returnerte radene til et spesifisert nummer.

Blokk: Maksimal tid til å vente på at et nytt element skal vises i strømmen.

De to foregående alternativene er valgfrie for kommandoen.

Strømmer: Nøkkelen til strømmen. Dette er et obligatorisk alternativ og må være det siste alternativet i kommandoen siden det godtar den variable lengden på nøkler og oppførings -ID -er.

: IDen til strømoppføringen.

Flere nøkler kan spesifiseres siden kommandoen lar deg lese fra mer enn en strøm. Samtidig kan flere ID -er leveres.

Denne kommandoen returnerer et array -svar. Hver matriseelement består av to elementer som vist i følgende format:

Eksempel 1: Inspiser værdataene for to steder med ikke-blokkerende xread

La oss anta at vi fikk to strømmer som inneholder værdataene for LA og NYC. I vårt værdatapublikasjonsside, må vi konsumere fra begge strømmer og hente de nyeste værdataene for disse to stedene. Xread-kommandoen er den ideelle kandidaten som skal brukes i dette scenariet med sin ikke-blokkerende variant.

Det er på tide å lage to strømmer som heter Vær: NYC og Vær: la og befolke et par oppføringer med noen feltverdipar som vist i følgende:

Xadd Weather: NYC * Wind 45 Fuktighet 78 Temp 12
Xadd Weather: LA * Wind 12 Fuktighet 45 Temp 22

Begge bekkene Vær: NYC og Vær: LC opprettes vellykket og de returnerte inngangs -ID -ene er 1658114094434-0 og 1658114110474-0, henholdsvis.

La oss bruke xread-kommandoen til å lese fra begge strømmer samtidig på en ikke-blokkerende måte.

xread strømmer vær: nyc vær: la 0 0

Som forventet inneholder utgangen oppføringene fra begge strømmer med ID -sekvensen som starter fra 0. Det er akseptabelt å spesifisere de ufullstendige ID -ene som tidligere illustrert der begge ID -ene er 0 som er millisekundens tidsstempel uten sekvensnummerdelen. Derfor kan den forrige kommandoen skrives som i følgende:

xread strømmer vær: NYC vær: la 0-0 0-0

La oss legge et par oppføringer til begge bekkene nå.

Xadd Weather: NYC * Wind 10 Fuktighet 60 Temp 10
Xadd Weather: LA * Wind 18 Fuktighet 80 Temp 5

Siden vi allerede har de siste oppførings -ID -ene for begge strømmer fra de tidligere kommandoene, la oss ringe xread -kommandoen igjen for å hente alle oppføringene med større ID -er enn de som vi allerede spurte.

XREAD Streams Weather: NYC Weather: LA 1658114094434-0 1658114110474-0

Som du kunne se, er de spesifiserte ID -ene fra forrige spørring. Nå returnerer kommandosamtalen alle oppføringene som har større ID -er enn de spesifiserte.

Som du kan se, returneres de nylig tilførte oppføringene fra forrige kommando. Neste, det du kan gjøre er å ta oppførings -ID -ene som er returnert fra forrige kommando og ring XRead med disse ID -ene til den returnerte matrisen er tom.

Eksempel 2: Få de siste pizzakampanjene med blokkering av XREAD

Det er en annen variant av xread-kommandoen som kan brukes til å vente til utgiverne publiserer nye data til strømmen uten å avslutte umiddelbart som en ikke-blokkerende samtale. La oss anta et scenario der pizza -gutta ønsker å skyve varslene til alle kundene angående de siste kampanjene som er tilgjengelige. Det kan ikke være noen kampanjer på bestemte dager. Derfor bør kundene vente til de nye kampanjene er tilgjengelige. Det kan oppnås med xread -kommandoen med blokkeringsalternativet på plass.

La oss anta at pizzaselskapet publiserer kampanjetaljer til en strøm som heter Pizzapromos: Daily. Derfor kan vi bruke xread -kommandoen til å vente til et nytt promo -vare er lagt til strømmen.

xread block 50000 streams pizzapromosnew: daglig $

I dette tilfellet spesifiserer vi oppførings -IDen som $ som tolkes som toppinngangs -ID. Derfor vil kommandoen bare spørre de nye oppføringene som er lagt til strømmen og ikke de historiske oppføringene.

Siden vi ikke har lagt til nye oppføringer til strømmen, vil den timeout etter 50000 millisekunder med en nil Retur som vist i følgende:

La oss nå legge til en oppføring i strømmen ved hjelp av XADD mens en annen forbruker venter på dataene med Xread -kommandoen som vist på følgende:

Som forventet blir den ekstra oppføringen konsumert av forbrukeren umiddelbart. Fra neste samtale må vi sørge for at vi passerer ID -en som blir returnert fra denne kommandoen og ikke $. Hvis ikke, vil vi savne oppføringene som er lagt til i mellom.

Hvis flere klienter venter på den samme strømmen, skyves de nylig tilførte dataene til dem alle. Xread -kommandoen er en veldig nyttig og anbefalt kommando å bruke i å blokkere naturapplikasjonene.

Konklusjon

For å oppsummere, er XRead -kommandoen en av de mye brukte kommandoene som fungerer på Redis -strømmen. Det kan fungere på både blokkerende og ikke-blokkerende måter. Som diskutert, er den ikke-blokkerende varianten veldig lik Xrange-kommandoen med et par forskjeller. I tillegg kan denne kommandoen brukes med blokkeringsalternativet til å vente til utgiverne publiserer nye data til strømmen. Totalt sett er xread -kommandoen spesialisert på å konsumere dataene fra flere strømmer samtidig. Det er en nyttig funksjon som de moderne applikasjonene leter etter.