
Redis Stream â en ny abstrakt datatyp som introducerades i Redis med version 5.0
Konceptuellt Àr Redis Stream en lista dÀr du kan lÀgga till poster. Varje post har ett unikt identifierare. Som standard genereras identifieraren automatiskt och inkluderar en tidsstÀmpel. DÀrför kan du begÀra intervall av poster baserat pÄ tid eller fÄ nya data i realtid nÀr de kommer in i strömmen, likt Unix-kommandot "tail -f" som lÀser en loggfil och stannar upp i vÀntan pÄ nya data. TÀnk pÄ att flera klienter kan lyssna pÄ strömmen samtidigt, precis som mÄnga "tail -f" processer kan lÀsa en fil utan att kollidera med varandra.
För att förstÄ alla fördelar med den nya datatypen, lÄt oss snabbt pÄminna oss om de Àldre Redis-strukturer som delvis Äterger funktionaliteten hos Redis Stream.
Redis PUB/SUB
Redis Pub/Sub â ett enkelt meddelandesystem, redan inbyggt i ditt key-value lagringssystem. Men enkelheten har sina nackdelar:
- Om en utgivare av nÄgon anledning gÄr ner förlorar de alla sina prenumeranter
- Utgivaren mÄste kÀnna till den exakta adressen till alla sina prenumeranter
- Utgivaren kan överbelasta sina prenumeranter om data publiceras snabbare Àn de kan bearbeta
- Meddelandet tas bort frÄn utgivarens buffert omedelbart efter publicering, oavsett hur mÄnga prenumeranter det har levererats till och hur snabbt de lyckas bearbeta meddelandet.
- Alla prenumeranter fÄr meddelandet samtidigt. Prenumeranterna mÄste sjÀlva samordna ordningen för bearbetningen av samma meddelande.
- Det finns ingen inbyggd mekanism för att bekrÀfta att prenumeranten har bearbetat meddelandet framgÄngsrikt. Om prenumeranten tar emot meddelandet och kraschar under bearbetningen, kommer utgivaren inte att veta nÄgot om det.
Redis List
Redis List â en datatyp som stödjer blockerande lĂ€sorder. Du kan lĂ€gga till och lĂ€sa meddelanden frĂ„n början eller slutet av listan. Baserat pĂ„ denna struktur kan man skapa en ganska bra stack eller kö för ditt distribuerade system, vilket i de flesta fall kommer att vara tillrĂ€ckligt. De huvudsakliga skillnaderna frĂ„n Redis Pub/Sub Ă€r:
- Meddelandet levereras till en enda klient. Den första blockerade lÀsande klienten fÄr data först.
- Clint mÄste sjÀlv initiera lÀsoperationen för varje meddelande. List vet ingenting om kunder.
- Meddelanden lagras tills nÄgon lÀser dem eller raderar dem explicit. Om du har konfigurerat Redis-servern att spara data pÄ disk ökar systemets tillförlitlighet kraftigt.
Introduktion till Stream
LÀgga till en post i strömmen
Team XADD lÀgger till en ny post i strömmen. En post Àr inte bara en rad, utan bestÄr av en eller flera nyckel-vÀrde-par. SÄledes Àr varje post redan strukturerad och pÄminner om strukturen av en CSV-fil.
> XADD mystream * sensor-id 1234 temperature 19.8
1518951480106-0
I exemplet ovan lÀgger vi till i strömmen med namnet (nyckeln) "mystream" tvÄ fÀlt: "sensor-id" och "temperature" med vÀrdena "1234" och "19.8" respektive. Som andra argument tar kommandot en identifierare som kommer att tilldelas posten - denna identifierare identifierar entydigt varje post i strömmen. I det hÀr fallet skickade vi *, eftersom vi vill att Redis ska generera en ny identifierare för oss. Varje ny identifierare kommer att vara högre. DÀrför kommer varje ny post att ha en större identifierare i förhÄllande till de tidigare posterna.
Format för identifierare
Identifieraren för posten som returneras av kommandot XADD, bestÄr av tvÄ delar:
{millisecondsTime}-{sequenceNumber}
millisecondsTime â Unix-tid i millisekunder (tid servern Redis). Men om den aktuella tiden visar sig vara densamma eller mindre Ă€n tiden för den föregĂ„ende posten, anvĂ€nds tidsstĂ€mplingen för den föregĂ„ende posten. DĂ€rför, om serverns tid gĂ„r bakĂ„t, kommer den nya identifieraren fortfarande att behĂ„lla sin egenskap av att öka.
sequenceNumber anvÀnds för poster som skapades vid samma millisekund. sequenceNumber kommer att ökas med 1 i förhÄllande till den föregÄende posten. Eftersom sequenceNumber har en storlek pÄ 64 bitar, sÄ bör du i praktiken inte stöta pÄ begrÀnsningen av antalet poster som kan genereras under en millisekund.
Formatet pÄ dessa identifierare kan vid första anblicken verka konstigt. En skeptisk lÀsare kan undra varför tid Àr en del av identifieraren. Anledningen Àr att Redis-strömmar stödjer förfrÄgningar med intervall baserat pÄ identifierare. Eftersom identifieraren Àr kopplad till tidpunkten för postens skapande, ger det möjlighet att begÀra tidsintervall. Vi kommer att gÄ igenom ett konkret exempel nÀr vi studerar kommandot. XRANGE.
Om anvÀndaren av nÄgon anledning behöver ange sin egen identifierare, som exempelvis Àr kopplad till nÄgot externt system, kan vi överföra den till kommandot XADD istÀllet för prick (*) som visas nedan:
> XADD somestream 0-1 field value
0-1
> XADD somestream 0-2 foo bar
0-2
Observera att du i detta fall mÄste hÄlla koll pÄ att identifieraren ökar. I vÄrt exempel Àr den minimi identifieraren "0-1", sÄ kommandot kommer inte att acceptera ytterligare en identifierare som Àr lika med eller mindre Àn "0-1".
> XADD somestream 0-1 foo bar
(error) ERR ID:n som anges i XADD Àr lika med eller mindre Àn toppelementet i mÄlströmmen
Antal poster i strömmen
Du kan fÄ antalet poster i strömmen genom att helt enkelt anvÀnda kommandot XLEN. För vÄrt exempel kommer detta kommando att returnera följande vÀrde:
> XLEN somestream
(integer) 2
FörfrĂ„gningar med intervall â XRANGE och XREVRANGE
För att begĂ€ra data över ett intervall mĂ„ste vi ange tvĂ„ identifierare â början och slutet av intervallet. Det returnerade intervallet kommer att inkludera alla element, inklusive grĂ€nser. Det finns ocksĂ„ tvĂ„ specialidentifierare "-" och "+", som respektive betyder den minsta (första posten) och den största (senaste posten) identifieraren i strömmen. Exemplet nedan kommer att visa alla poster i strömmen.
> XRANGE mystream - +
1) 1) 1518951480106-0
2) 1) "sensor-id"
2) "1234"
3) "temperature"
4) "19.8"
2) 1) 1518951482479-0
2) 1) "sensor-id"
2) "9999"
3) "temperature"
4) "18.2"
Varje returnerad posten representerar en array med tvÄ element: identifierare och en lista av nyckel-vÀrde-par. Vi har redan nÀmnt att identifierarna för poster Àr relaterade till tid. SÄledes kan vi begÀra ett intervall för en specifik tidsperiod. Dock kan vi ange ett ofullstÀndigt identifierare i begÀran, genom att utelÀmna delen som rör sequenceNumber. Den utelÀmnade delen av identifieraren antas automatiskt vara noll i början av intervallet och det maximala vÀrdet i slutet av intervallet. HÀr Àr ett exempel pÄ hur man kan begÀra ett intervall som Àr tvÄ millisekunder.
> XRANGE mystream 1518951480106 1518951480107
1) 1) 1518951480106-0
2) 1) "sensor-id"
2) "1234"
3) "temperatur"
4) "19.8"
Vi har bara en post i det hÀr intervallet, men i verkliga datamÀngder kan det returnerade resultatet vara enormt. Av den anledningen XRANGE stöder COUNT-alternativet. Genom att ange ett antal kan vi helt enkelt fÄ de första N posterna. Om vi behöver hÀmta de nÀsta N posterna (sidhÀnvisning), kan vi anvÀnda den senaste hÀmtade identifieraren, öka den sequenceNumber med ett och begÀra igen. LÄt oss se pÄ detta i nÀsta exempel. Vi börjar lÀgga till 10 element med hjÀlp av XADD (lÄt oss anta att strömmen mystream redan har fyllts med 10 element). För att starta iterationen och hÀmta 2 element per kommando, börjar vi med det fullstÀndiga intervallet, men med COUNT satt till 2.
> XRANGE mystream - + COUNT 2
1) 1) 1519073278252-0
2) 1) "foo"
2) "value_1"
2) 1) 1519073279157-0
2) 1) "foo"
2) "value_2"
För att fortsÀtta iterationen med de nÀsta tvÄ elementen mÄste vi vÀlja den senaste hÀmtade identifieraren, det vill sÀga 1519073279157-0, och lÀgga till 1 till sequenceNumber.
den resulterande identifieraren, i detta fall 1519073279157-1, som nu kan anvÀndas som ett nytt startargument för nÀsta anrop XRANGE:
> XRANGE mystream 1519073279157-1 + COUNT 2
1) 1) 1519073280281-0
2) 1) "foo"
2) "value_3"
2) 1) 1519073281432-0
2) 1) "foo"
2) "value_4"
Och sÄ vidare. Eftersom komplexiteten XRANGE Àr O(log (N)) för att söka, och sedan O(M) för att returnera M element, Àr varje steg i iterationen snabbt. PÄ sÄ sÀtt kan man XRANGE effektivt iterera över strömmar.
Team XREVRANGE Àr ekvivalent med XRANGE, men returnerar elementen i omvÀnd ordning:
> XREVRANGE mystream + - COUNT 1
1) 1) 1519073287312-0
2) 1) "foo"
2) "value_10"
Observera att kommandot XREVRANGE tar start- och stoppargument i omvÀnd ordning.
Att lÀsa nya poster med hjÀlp av XREAD
kan ofta innebÀra att man prenumererar pÄ en ström och bara fÄr nya meddelanden. Detta koncept kan verka liknande Redis Pub/Sub eller blockerande Redis List, men det finns grundlÀggande skillnader i hur Redis Stream anvÀnds:
- Varje nytt meddelande levereras som standard till varje prenumerant. Detta beteende skiljer sig frÄn en blockerande Redis-lista, dÀr ett nytt meddelande endast lÀses av en viss prenumerant.
- Medan i Redis Pub/Sub glöms alla meddelanden bort och sparas aldrig, sparas alla meddelanden i Stream under obestÀmd tid (om klienten inte uttryckligen begÀr borttagning).
- Redis Stream möjliggör att begrÀnsa Ätkomsten till meddelanden inom en och samma ström. En specifik prenumerant kan endast se sin personliga meddelandehistorik.
Du kan prenumerera pÄ strömmen och ta emot nya meddelanden med kommandot XREAD. Detta Àr nÄgot mer komplicerat Àn XRANGE, sÄ vi börjar med enklare exempel först.
> XREAD COUNT 2 STREAMS mystream 0
1) 1) "mystream"
2) 1) 1) 1519073278252-0
2) 1) "foo"
2) "value_1"
2) 1) 1519073279157-0
2) 1) "foo"
2) "value_2"
I exemplet ovan anges den icke-blockerande formen XREAD. Observera att alternativet COUNT inte Ă€r obligatoriskt. Den enda obligatoriska parametern för kommandot Ă€r alternativet STREAMS som anger listan över strömmar tillsammans med motsvarande maximala identifierare. Vi skrev "STREAMS mystream 0" â vi vill ta emot alla poster frĂ„n strömmen mystream med en identifierare större Ă€n "0-0". Som framgĂ„r av exemplet returnerar kommandot namnet pĂ„ strömmen, eftersom vi kan prenumerera pĂ„ flera strömmar samtidigt. Vi skulle kunna skriva till exempel "STREAMS mystream otherstream 0 0". Observera att vi efter alternativet STREAMS först behöver ange namnen pĂ„ alla behövliga strömmar och sedan listan över identifierare.
I denna enkla form gör kommandot inget sÀrskilt jÀmfört med XRANGE. Det intressanta Àr dock att vi enkelt kan omvandla XREAD till ett blockerande kommando genom att ange argumentet BLOCK:
> XREAD BLOCK 0 STREAMS mystream $
I exemplet ovan anges den nya parametern BLOCK med en tidsgrÀns pÄ 0 millisekunder (vilket innebÀr oÀndlig vÀntan). Dessutom, istÀllet för att skicka en vanlig identifierare för strömmen mystream, gavs en speciell identifierare $. Denna speciella identifierare innebÀr att XREAD ska anvÀnda den maximala identifieraren i strömmen mystream. SÄ vi kommer att ta emot endast nya meddelanden frÄn det ögonblick vi började lyssna. PÄ sÀtt och vis liknar detta Unix-kommandot "tail -f".
Observera att nÀr vi anvÀnder BLOCK-alternativet behöver vi inte nödvÀndigtvis anvÀnda ett speciellt ID $. Vi kan anvÀnda vilket befintligt ID som helst i strömmen. Om kommandot kan hantera vÄr förfrÄgan omedelbart, utan att blockera, kommer det att göra det, annars kommer det att blockeras.
Blockerande XREAD kan ocksÄ lyssna pÄ flera strömmar samtidigt, det Àr bara nödvÀndigt att ange deras namn. I sÄ fall kommer kommandot att returnera posten för den första strömmen som fick data. Den första prenumeranten som blockeras för denna ström kommer att ta emot data först.
Konsumentgrupper
I vissa uppgifter vill vi avgrÀnsa prenumeranternas tillgÄng till meddelanden inom en ström. Ett exempel pÄ nÀr detta kan vara anvÀndbart Àr en meddelandekö med arbetare som kommer att ta emot olika meddelanden frÄn strömmen, vilket möjliggör att skala behandling av meddelanden.
Om vi förestÀller oss att vi har tre prenumeranter C1, C2, C3 och en ström som innehÄller meddelandena 1, 2, 3, 4, 5, 6, 7, kommer behandlingen av meddelandena att ske som i diagrammet nedan:
1 -> C1
2 -> C2
3 -> C3
4 -> C1
5 -> C2
6 -> C3
7 -> C1
För att uppnÄ denna effekt anvÀnder Redis Stream ett begrepp som kallas Konsumentgrupp. Detta begrepp liknar en pseudoprenumerant som fÄr data frÄn strömmen, men hanteras faktiskt av flera prenumeranter inom gruppen och ger specifika garantier:
- Varje meddelande levereras till olika prenumeranter inom gruppen.
- Inom gruppen identifieras prenumeranter av ett namn som Àr en strÀng med skiftlÀgeskÀnslighet. Om nÄgon prenumerant tillfÀlligt faller ur gruppen kan den ÄterfÄ sin plats i gruppen med sitt unika namn.
- Varje konsumentgrupp följer begreppet 'första olÀsta meddelande'. NÀr en prenumerant begÀr nya meddelanden kan den endast fÄ de meddelanden som aldrig tidigare har levererats till nÄgon prenumerant inom gruppen.
- Det finns ett kommando för att bekrÀfta framgÄngsrik behandling av meddelandet av prenumeranten. SÄ lÀnge detta kommando inte har anropats kommer det begÀrda meddelandet att förbli i statusen 'pending'.
- Inom konsumentgruppen kan varje prenumerant begÀra en historik av meddelanden som har levererats just till honom, men som Ànnu inte har behandlats (i statusen 'pending').
PÄ ett sÀtt kan tillstÄndet hos gruppen representeras sÄ hÀr:
+----------------------------------------+
| consumer_group_name: mygroup
| consumer_group_stream: somekey
| last_delivered_id: 1292309234234-92
|
| consumers:
| "consumer-1" med vÀntande meddelanden
| 1292309234234-4
| 1292309234232-8
| "consumer-42" med vÀntande meddelanden
| ... (och sÄ vidare)
+----------------------------------------+
Nu Àr det dags att bekanta sig med de grundlÀggande kommandona för Consumer Group, nÀmligen:
- XGROUP anvÀnds för att skapa, radera och hantera grupper
- XREADGROUP anvÀnds för att lÀsa strömmen via gruppen
- XACK â detta kommando lĂ„ter prenumeranten markera meddelandet som framgĂ„ngsrikt behandlat
Skapa en Consumer Group
Anta att strömmen mystream redan finns. DÄ kommer kommandot för att skapa gruppen att se ut som följer:
> XGROUP CREATE mystream mygroup $
OK
NÀr vi skapar en grupp mÄste vi ange ett ID, med vilket gruppen kommer att börja ta emot meddelanden. Om vi vill ta emot alla nya meddelanden kan vi anvÀnda det speciella ID:t $ (som i vÄrt exempel ovan). Om istÀllet det speciella ID:t anges som 0, sÄ kommer gruppen att fÄ tillgÄng till alla meddelanden i strömmen.
Nu nÀr gruppen har skapats kan vi genast börja lÀsa meddelanden med hjÀlp av kommandot XREADGROUP. Detta kommando liknar mycket XREAD och har en valfri parameter BLOCK. Men det finns en obligatorisk parameter GROUP som alltid mÄste anges med tvÄ argument: gruppens namn och prenumerantens namn. Parameter COUNT stöds ocksÄ.
Innan vi lÀser strömmen, lÄt oss lÀgga till nÄgra meddelanden dÀr:
> XADD mystream * message apple
1526569495631-0
> XADD mystream * message orange
1526569498055-0
> XADD mystream * message strawberry
1526569506935-0
> XADD mystream * message apricot
1526569535168-0
> XADD mystream * message banana
1526569544280-0
Och nu ska vi försöka lÀsa denna ström genom gruppen:
> XREADGROUP GROUP mygroup Alice COUNT 1 STREAMS mystream >
1) 1) "mystream"
2) 1) 1) 1526569495631-0
2) 1) "message"
2) "apple"
Det ovanstÄende kommandot sÀger ordagrant följande:
«Jag, Alice-prenumeranten, medlem av gruppen mygroup, vill lÀsa frÄn strömmen mystream ett meddelande som aldrig har levererats till nÄgon tidigare.»
Varje gĂ„ng en prenumerant utför en Ă„tgĂ€rd med en grupp mĂ„ste han ange sitt namn och tydligt identifiera sig inom gruppen. I kommandot ovan finns en till mycket viktig detalj â den speciella identifieraren ">>". Denna speciella identifierare filtrerar meddelanden och behĂ„ller endast de som inte tidigare har levererats.
I vissa speciella fall kan du ange ett verkligt identifieringsnummer, som 0 eller nÄgot annat giltigt identifieringsnummer. I sÄ fall kommer kommandot XREADGROUP att ge dig historiken för meddelanden med status "pending" som har levererats till den angivna prenumeranten (Alice), men som fortfarande inte har bekrÀftats med kommandot XACK.
Vi kan kontrollera detta beteende genom att omedelbart ange identifieraren 0, utan alternativet COUNT. Vi kommer att se ett enda vÀntande meddelande, nÀmligen meddelandet med Àpplet:
> XREADGROUP GROUP mygroup Alice STREAMS mystream 0
1) 1) "mystream"
2) 1) 1) 1526569495631-0
2) 1) "message"
2) "apple"
Men om vi bekrÀftar meddelandet som framgÄngsrikt behandlat, kommer det inte lÀngre att visas:
> XACK mystream mygroup 1526569495631-0
(integer) 1
> XREADGROUP GROUP mygroup Alice STREAMS mystream 0
1) 1) "mystream"
2) (tom lista eller uppsÀttning)
Nu Àr det Bobs tur att lÀsa nÄgot:
> XREADGROUP GROUP mygroup Bob COUNT 2 STREAMS mystream >
1) 1) "mystream"
2) 1) 1) 1526569498055-0
2) 1) "message"
2) "orange"
2) 1) 1526569506935-0
2) 1) "message"
2) "strawberry"
Bob, medlem av gruppen mygroup, bad om högst tvÄ meddelanden. Kommandot rapporterar bara otilldelade meddelanden pÄ grund av den speciella identifieraren ">>". Som du ser visas inte meddelandet "apple", eftersom det redan har levererats till Alice, sÄ Bob fÄr "orange" och "strawberry".
SÄledes kan Alice, Bob och alla andra prenumeranter i gruppen lÀsa olika meddelanden frÄn samma ström. De kan ocksÄ lÀsa sin historik av obearbetade meddelanden eller markera meddelanden som bearbetade.
Det finns nÄgra saker att tÀnka pÄ:
- SÄ snart prenumeranten lÀser meddelandet med kommandot XREADGROUP, gÄr detta meddelande in i tillstÄndet "pending" och lÄses för den specifika prenumeranten. Andra prenumeranter i gruppen kan inte lÀsa detta meddelande.
- Prenumeranter skapas automatiskt vid första omnÀmnandet, det Àr inte nödvÀndigt att skapa dem explicit.
- Med hjÀlp av XREADGROUP Du kan lÀsa meddelanden frÄn flera olika flöden samtidigt, men för att detta ska fungera mÄste du först skapa grupper med samma namn för varje flöde med hjÀlp av XGROUP
à terstÀllning efter krasch
En prenumerant kan ÄterhÀmta sig efter en krasch och lÀsa sin lista med meddelanden med status "pending". Men i den verkliga vÀrlden kan prenumeranter misslyckas helt. Vad hÀnder med de hÀngande meddelandena om prenumeranten inte kan ÄterhÀmta sig efter kraschen?
Consumer Group erbjuder en funktion som anvĂ€nds just för sĂ„dana fall â nĂ€r det Ă€r nödvĂ€ndigt att byta Ă€gare av meddelanden.
Först mÄste du anropa kommandot XPENDING, som visar alla meddelanden i gruppen med status "pending". I sin enklaste form anropas kommandot bara med tvÄ argument: namnet pÄ flödet och namnet pÄ gruppen:
> XPENDING mystream mygroup
1) (integer) 2
2) 1526569498055-0
3) 1526569506935-0
4) 1) 1) "Bob"
2) "2"
Kommandot visade antalet obearbetade meddelanden för hela gruppen och för varje prenumerant. Vi har bara Bob med tvÄ obearbetade meddelanden, eftersom det enda meddelandet som begÀrdes av Alice bekrÀftades med XACK.
Vi kan begÀra ytterligare information genom att anvÀnda fler argument:
XPENDING {key} {groupname} [{start-id} {end-id} {count} [{consumer-name}]]
{start-id} {end-id} â intervall av identifierare (kan anvĂ€nda "-" och "+")
{count} â antal leveransförsök
{consumer-name} â namn pĂ„ gruppen
> XPENDING mystream mygroup - + 10
1) 1) 1526569498055-0
2) "Bob"
3) (integer) 74170458
4) (integer) 1
2) 1) 1526569506935-0
2) "Bob"
3) (integer) 74170458
4) (integer) 1
Nu har vi detaljer för varje meddelande: identifierare, prenumerantens namn, stillestÄndstid i millisekunder och slutligen antal leveransförsök. Vi har tvÄ meddelanden frÄn Bob, och de har varit stillastÄende i 74170458 millisekunder, ungefÀr 20 timmar.
Observera att ingenting hindrar oss frÄn att kontrollera vad meddelandets innehÄll var, bara genom att anvÀnda XRANGE.
> XRANGE mystream 1526569498055-0 1526569498055-0
1) 1) 1526569498055-0
2) 1) "meddelande"
2) "orange"
Vi mÄste helt enkelt upprepa samma identifierare tvÄ gÄnger i argumenten. Nu nÀr vi har en viss uppfattning kan Alice besluta att efter 20 timmar av stillestÄnd Àr det troligt att Bob inte kommer att ÄterhÀmta sig, och det Àr dags att begÀra dessa meddelanden och Äteruppta deras bearbetning istÀllet för Bob. För detta anvÀnder vi kommandot XCLAIM:
XCLAIM {key} {group} {consumer} {min-idle-time} {ID-1} {ID-2} ... {ID-N}
Med det hÀr kommandot kan vi fÄ ett "frÀmmande" meddelande som Ànnu inte har behandlats genom att byta Àgare till {consumer}. Vi kan dock ocksÄ ange minimal stillestÄndstid {min-idle-time}. Detta hjÀlper till att undvika situationen dÀr tvÄ kunder försöker byta Àgare för samma meddelanden samtidigt.
Kund 1: XCLAIM mystream mygroup Alice 3600000 1526569498055-0
Kund 2: XCLAIM mystream mygroup Lora 3600000 1526569498055-0
Den första kunden kommer att ÄterstÀlla stillestÄndstiden och öka rÀknaren för leveranser. SÄ den andra kunden kommer inte att kunna begÀra det.
> XCLAIM mystream mygroup Alice 3600000 1526569498055-0
1) 1) 1526569498055-0
2) 1) "meddelande"
2) "orange"
Meddelandet har framgÄngsrikt begÀrts av Alice, som nu kan bearbeta meddelandet och bekrÀfta det.
Av det ovanstÄende exemplet kan vi se att en lyckad begÀran returnerar sjÀlva meddelandets innehÄll. Men det Àr inte nödvÀndigt. JUSTID-alternativet kan anvÀndas för att returnera endast meddelande-ID:n. Detta Àr anvÀndbart om du inte Àr intresserad av meddelandets detaljer och vill öka systemets prestanda.
LeveransrÀknare
RĂ€knaren som du ser i utskriften XPENDING â Ă€r antalet leveranser för varje meddelande. Denna rĂ€knare ökar pĂ„ tvĂ„ sĂ€tt: nĂ€r meddelandet framgĂ„ngsrikt begĂ€rs via XCLAIM eller nĂ€r anropet anvĂ€nds XREADGROUP.
Det Àr normalt att vissa meddelanden levereras flera gÄnger. Det viktigaste Àr att alla meddelanden har behandlats till slut. Ibland kan det uppstÄ problem vid bearbetningen av ett meddelande, antingen pÄ grund av skador pÄ sjÀlva meddelandet eller för att bearbetningen av meddelandet orsakar ett fel i bearbetningskoden. I sÄdana fall kan det hÀnda att ingen kan behandla detta meddelande. Eftersom vi har en leveransförsöksrÀknare kan vi anvÀnda den för att upptÀcka sÄdana situationer. DÀrför, sÄ snart leveransrÀknaren nÄr det stora antal som du har angivit, kan det vara klokare att placera detta meddelande i en annan ström och skicka en avisering till systemadministratören.
Strömmarnas tillstÄnd
Team XINFO anvÀnds för att begÀra olika typer av information om strömmen och dess grupper. Till exempel ser den grundlÀggande formen av kommandot ut sÄ hÀr:
> XINFO STREAM mystream
1) length
2) (integer) 13
3) radix-tree-keys
4) (integer) 1
5) radix-tree-nodes
6) (integer) 2
7) groups
8) (integer) 2
9) first-entry
10) 1) 1524494395530-0
2) 1) "a"
2) "1"
3) "b"
4) "2"
11) last-entry
12) 1) 1526569544280-0
2) 1) "meddelande"
2) "banana"
Kommandot ovan visar allmÀn information om den angivna strömmen. Nu ett lite mer avancerat exempel:
> XINFO GROUPS mystream
1) 1) namn
2) "mygroup"
3) konsumenter
4) (heltal) 2
5) vÀntande
6) (heltal) 2
2) 1) namn
2) "some-other-group"
3) konsumenter
4) (heltal) 1
5) vÀntande
6) (heltal) 0
Kommandot ovan visar allmÀn information om alla grupper i den angivna strömmen
> XINFO CONSUMERS mystream mygroup
1) 1) namn
2) "Alice"
3) vÀntande
4) (heltal) 1
5) inaktiv
6) (heltal) 9104628
2) 1) namn
2) "Bob"
3) vÀntande
4) (heltal) 1
5) inaktiv
6) (heltal) 83841983
Kommandot ovan visar information om alla prenumeranter i den angivna strömmen och gruppen.
Om du glömmer syntaksen för kommandot kan du alltid be om hjÀlp av sjÀlva kommandot:
> XINFO HELP
1) XINFO {subcommand} arg arg ... arg. Underkommandon Àr:
2) CONSUMERS {nyckel} {gruppenamn} -- Visa konsumentgrupper för grupp {gruppenamn}.
3) GROUPS {nyckel} -- Visa strömmens konsumentgrupper.
4) STREAM {nyckel} -- Visa information om strömmen.
5) HELP -- Skriv ut denna hjÀlp.
BegrÀnsning av strömmens storlek
MÄnga applikationer vill inte samla data i en ström för alltid. Det Àr ofta anvÀndbart att ha en maximal mÀngd meddelanden i strömmen. I andra fall Àr det bra att flytta alla meddelanden frÄn strömmen till ett annat permanent lagringsutrymme nÀr den angivna storleken pÄ strömmen nÄs. Du kan begrÀnsa strömmens storlek med hjÀlp av parametern MAXLEN i kommandot XADD:
> XADD mystream MAXLEN 2 * value 1
1526654998691-0
> XADD mystream MAXLEN 2 * value 2
1526654999635-0
> XADD mystream MAXLEN 2 * value 3
1526655000369-0
> XLEN mystream
(heltal) 2
> XRANGE mystream - +
1) 1) 1526654999635-0
2) 1) "value"
2) "2"
2) 1) 1526655000369-0
2) 1) "value"
2) "3"
NÀr MAXLEN anvÀnds tas gamla poster automatiskt bort nÀr den angivna lÀngden nÄs, sÄ att strömmen har en konstant storlek. Men beskÀrning sker i detta fall inte pÄ det mest effektiva sÀttet i minnet i Redis. Situationen kan förbÀttras pÄ följande sÀtt:
XADD mystream MAXLEN ~ 1000 * ... inmatningsfÀlt hÀr ...
Argumentet ~ i exemplet ovan innebÀr att vi inte nödvÀndigtvis behöver begrÀnsa strömmens lÀngd till ett specifikt vÀrde. I vÄrt exempel kan det vara vilket som helst vÀrde som Àr större Àn eller lika med 1000 (till exempel 1000, 1010 eller 1030). Vi har bara tydligt angett att vi vill att vÄr ström skall lagra minst 1000 poster. Detta gör minneshanteringen mycket mer effektiv inuti Redis.
Det finns ocksÄ ett separat kommando XTRIM, som gör samma sak:
> XTRIM mystream MAXLEN 10
> XTRIM mystream MAXLEN ~ 10
Permanenta lagring och replikering
Redis Stream replikeras asynkront till slavnoder och lagras i filer av typen AOF (snapshot av alla data) och RDB (logg över alla skrivoperationer). à terstÀllning av tillstÄnd för Consumer Groups stöds ocksÄ. SÄ om ett meddelande har statusen «pending» pÄ masternoden, kommer det att ha samma status pÄ slavnoderna.
Ta bort specifika element frÄn strömmen
För att ta bort meddelanden finns det ett speciellt kommando XDEL. Kommandot tar ett strömnamn följt av identifierare för meddelanden som ska tas bort:
> XRANGE mystream - + COUNT 2
1) 1) 1526654999635-0
2) 1) "value"
2) "2"
2) 1) 1526655000369-0
2) 1) "value"
2) "3"
> XDEL mystream 1526654999635-0
(integer) 1
> XRANGE mystream - + COUNT 2
1) 1) 1526655000369-0
2) 1) "value"
2) "3"
Vid anvÀndning av detta kommando bör du beakta att minnet faktiskt inte kommer att frigöras omedelbart.
Strömmar med noll lÀngd
Skillnaden mellan strömmar och andra datatyper i Redis Àr att nÀr andra datatyper inte lÀngre har nÄgra element, sÄ raderas sjÀlva datatypen som en bieffekt frÄn minnet. Till exempel kommer ett sorterat set att helt tas bort nÀr ZREM-anropet tar bort det sista elementet. IstÀllet tillÄts strömmar att förbli i minnet Àven utan nÄgra element inuti.
Slutsats
Redis Stream Àr perfekt för att skapa meddelandebrokers, meddelandeköer, enhetliga loggar och chattssystem som lagrar historik.
Som en gÄng sade , program Àr algoritmer plus datatyper, och Redis ger dig redan bÄde och.
KĂ€lla: habr.com
