Redis Stream — teie sĂ”numisĂŒsteemide usaldusvÀÀrsus ja skaleeritavus

Redis Stream — teie sĂ”numisĂŒsteemide usaldusvÀÀrsus ja skaleeritavus

Redis Stream — uus abstraktne andmetĂŒĂŒp, mis tutvustati Redis 5.0 versiooniga.
Konceptsiooniliselt on Redis Stream nagu List, kuhu saate lisada kirjeid. Igal kirjel on ainulaadne identifikaator. Vaikimisi genereeritakse identifikaator automaatselt ja sisaldab ajatemplit. SeetĂ”ttu saate pĂ€rida ajavahemikke kirjed vĂ”i saada uusi andmeid voogusid, nagu Unix kĂ€sk „tail -f“ loeb logifaili ja ootab uusi andmeid. Pange tĂ€hele, et voogu saavad samaaegselt kuulata mitu klienti, nagu paljud „tail -f“ protsessid saavad samal ajal faili lugeda, konflikte tekitamata.

Uue andmetĂŒĂŒbi kĂ”iki eeliseid mĂ”istmiseks meenutame kiiresti varasemaid Redis-struktuure, mis osaliselt kordavad Redis Stream'i funktsionaalsust.

Redis PUB/SUB

Redis Pub/Sub on lihtne sĂ”numite sĂŒsteem, mis on juba teie vĂ”tme-vÀÀrtuse salvestusse sisse ehitatud. Kuid lihtsuse eest tuleb maksta:

  • Kui vĂ€ljund (publisher) mingil pĂ”hjusel vĂ€lja langeb, kaotab ta kĂ”ik oma tellijad.
  • VĂ€ljundil peab olema tĂ€pne aadress kĂ”igist oma tellijatest.
  • VĂ€ljund vĂ”ib koormata oma tellijaid, kui andmeid avaldatakse kiiremini, kui neid töödeldakse.
  • SĂ”num eemaldatakse vĂ€ljundi puhvrist kohe pĂ€rast avaldamist, sĂ”ltumata sellest, kui paljudele tellijatele see on edastatud ja kui kiiresti nad suudavad seda sĂ”numit töödelda.
  • KĂ”ik tellijad saavad sĂ”numi samal ajal. Tellijad peavad omavahel leppima kokku sama sĂ”numi töötlemise jĂ€rjekorras.
  • Puudub sisseehitatud mehhanism sĂ”numi eduka töötlemise kinnitamiseks tellija poolt. Kui tellija saab sĂ”numi ja tegevuse kĂ€igus langeb vĂ€lja, ei saa vĂ€ljund sellest teada.

Redis List

Redis List on andmestruktuur, mis toetab blokeerivaid lugemisekĂ€sku. Saate lisada ja lugeda sĂ”numeid nimekirja algusest vĂ”i lĂ”pust. Selle struktuuri pĂ”hjal on vĂ”imalik luua korralik virn vĂ”i jĂ€rjekord teie jaotatud sĂŒsteemis, ja enamasti on seda piisavalt. Peamised erinevused Redis Pub/Sub'i omadest:

  • SĂ”num edastatakse ĂŒhele kliendile. Esimene blokeeritud lugemise klient saab andmed esimesena.
  • Clint peab ise algatama iga sĂ”numi lugemise operatsiooni. List ei tea midagi klientidest.
  • SĂ”numid sĂ€ilivad seni, kuni keegi need loeb vĂ”i selgelt kustutab. Kui olete seadistanud Redis serveri niimoodi, et see salvestab andmed kettale, siis sĂŒsteemi usaldusvÀÀrsus paraneb oluliselt.

Sissejuhatus Streami

Kirje lisamine voogu

Meeskond XADD lisab voogu uue kirje. Kirje ei ole lihtsalt rida, vaid see koosneb ĂŒhest vĂ”i mitmest vĂ”tme-vÀÀrtuse paarist. Seega on iga kirje juba struktureeritud ja meenutab CSV faili struktuuri.

> XADD mystream * sensor-id 1234 temperature 19.8
1518951480106-0

Ülaltoodud nĂ€ites lisame voogu nimega (vĂ”tmena) «mystream» kaks vĂ€ljast: «sensor-id» ja «temperature» vÀÀrtustega «1234» ja «19.8» vastavalt. Teise argumendina vĂ”tab kĂ€sk identifikaatori, mis antakse kirjele – see identifikaator tuvastab iga kirje voos ĂŒhemĂ”tteliselt. Kuid sel korral edastasime *, kuna soovime, et Redis genereeriks meile uue identifikaatori. Iga uus identifikaator suureneb. Seega on iga uus kirje eelnevate kirjete suhtes suurema identifikaatoriga.

Identifikaatori formaat

Kirje identifikaator, mille kÀsk XADD, koosneb kahest osast:

{millisecondsTime}-{sequenceNumber}

millisecondsTime — Unix aeg millisekundites (aeg serverilt Redis). Kui aga praegune aeg on sama vĂ”i vĂ€iksem kui eelmise kirje aeg, kasutatakse eelmise kirje ajatemplit. Seega, kui serveri aeg tagastab minevikku, sĂ€ilitab uus identifikaator ikkagi suurenemise omaduse.

sequenceNumber kasutatakse samal millisekundil loodud kirje jaoks. sequenceNumber suurendatakse 1 vĂ”rra eelneva kirje suhtes. Kuna sequenceNumber on 64 bitti pikk, ei tohiks tegelikult tekkida piirangut, kui palju kirjeid saab genereerida ĂŒhe millisekundi jooksul.

Nende identifikaatorite formaat vĂ”ib esmapilgul tunduda kummaline. Kahtlev lugeja vĂ”ib kĂŒsida, miks on aeg osa identifikaatorist. PĂ”hjuseks on see, et Redis-puud toetavad identifikaatorite alusel vahemikku pĂ€ringute tegemist. Kuna identifikaator on seotud salvestise loomise ajaga, siis vĂ”imaldab see kĂŒsida aegu vahemikus. Vaadakem konkreetset nĂ€idet, kui liigume kĂ€su uurimise juurde. XRANGE.

Kui kasutajal on mingil pĂ”hjusel vaja mÀÀrata oma identifikaator, mis nt. on seotud mingi vĂ€list sĂŒsteemiga, siis vĂ”ime selle edastada kĂ€sule XADD tĂ€he * asemel nagu allpool nĂ€idatud:

> XADD somestream 0-1 field value
0-1
> XADD somestream 0-2 foo bar
0-2

Pange tĂ€hele, et sel juhul peate ise jĂ€lgima identifikaatori suurenemist. Meie nĂ€ites on minimaalne identifikaator "0-1", seega kĂ€sk ei vĂ”ta vastu veel ĂŒhte identifikaatorit, mis on vĂ”rdne vĂ”i vĂ€iksem kui "0-1".

> XADD somestream 0-1 foo bar
(error) ERR The ID specified in XADD is equal or smaller than the target stream top item

Kirjete arv voos

Voos olevate kirjete arvu saab lihtsalt saada kÀsuga XLEN. Selle nÀite puhul tagastab see kÀsk jÀrgmise vÀÀrtuse:

> XLEN somestream
(integer) 2

Vahemiku pĂ€ringud — XRANGE ja XREVRANGE

Andmete pĂ€rimiseks vahemiku alusel peame mÀÀrama kaks identifikaatorit — vahemiku alguse ja lĂ”pu. Tagastatav vahemik sisaldab kĂ”iki elemente, sealhulgas piire. Samuti on olemas kaks erilise identifikaatorit „-” ja „+”, mis vastavad vastavalt kĂ”ige vĂ€iksemale (esimene salvestis) ja kĂ”ige suuremale (viimane salvestis) identifikaatorile voos. Allolev nĂ€ide vĂ€ljastab kĂ”ik voogu kuuluvad salvestised.

> 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"

Iga tagastatud salvestis esindab kaht elementi: identifikaatori ja vĂ”tme-vÀÀrtuse paari loendi. Oleme juba maininud, et salvestise identifikaatorid on ajaga seotud. SeetĂ”ttu saame kĂŒsida teatud ajavahemiku vahemikku. Siiski saame pĂ€ringus mÀÀrata mitte tĂ€ieliku identifikaatori, vaid ainult Unix aja, jĂ€ttes vĂ€lja osa, mis on seotud sequenceNumberVahele jĂ€etud identifikaatori osa omistatakse automaatselt vahemiku alguses nullile ja vahemiku lĂ”pus maksimaalsele vĂ”imalikule vÀÀrtusele. Allpool on nĂ€ide, kuidas kĂŒsida vahemikku, mis on kaks millisekundit.

> XRANGE mystream 1518951480106 1518951480107
1) 1) 1518951480106-0
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.8"

Meil on selles vahemikus ainult ĂŒks kande, kuid reaalses andmehulkades vĂ”ib tagastatav tulemus olla tohutu. SeetĂ”ttu XRANGE toetab valikut COUNT. MÀÀrates arvu, saame lihtsalt saada esimesed N kannet. Kui me peame saama jĂ€rgmised N kannet (lehekĂŒljestamine), vĂ”ime kasutada viimati saadud identifikaatorit, suurendada seda sequenceNumber ĂŒhe vĂ”rra ja kĂŒsida uuesti. Vaatame seda jĂ€rgmises nĂ€ites. Alustame 10 elemendi lisamisega lĂ€bi XADD (eeldame, et mĂŒĂŒgivoog mystream on juba tĂ€idetud 10 elemendiga). Itereeringu alustamiseks, saades iga kĂ€su kohta 2 elementi, alustame tĂ€ielikust vahemikust, kuid COUNT on seatud 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"

JÀtkamiseks jÀrgmise kahe elemendi iteratsioonis peame valima viimase saadud identifikaatori, st 1519073279157-0, ja lisama 1 sequenceNumber.
saadud identifikaatorile, Antud juhul 1519073279157-1, saab nĂŒĂŒd kasutada uue argumendina vahemiku alguseks jĂ€rgmises kĂ”nes 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"

Ja nii edasi. Kuna keerukus XRANGE on O(log (N)) otsimiseks ja siis O(M) M elemendi tagastamiseks, on iga iteratsiooni samm kiire. Seega saab XRANGE efektiivselt vooge itererida.

Meeskond XREVRANGE on ekvivalent XRANGE, kuid tagastab elemendid vastupidises jÀrjekorras:

> XREVRANGE mystream + - COUNT 1
1) 1) 1519073287312-0
   2) 1) "foo"
      2) "value_10"

Pange tÀhele, et kÀsk XREVRANGE vÔtab argumentide osas vahemiku start ja stop vastupidises jÀrjekorras.

Uute kannete lugemine XREAD abil

Sageli on vaja tellida voogu ja saada vaid uusi sÔnumeid. See kontseptsioon vÔib tunduda sarnane Redis Pub/Sub-iga vÔi blokeeriva Redis Loendiga, kuid Redis Streami kasutamisel on pÔhimÔttelised erinevused:

  1. Iga uus sĂ”num jagatakse vaikimisi igale tellijale. See kĂ€itumine erineb blokeerivast Redis List'ist, kus uus sĂ”num loetakse ainult ĂŒhe tellija poolt.
  2. Samas kui Redis Pub/Sub kÔik sÔnumid unustatakse ja kunagi ei salvestata, salvestatakse Stream'is kÔik sÔnumid mÀÀramata ajaks (kui klient selgesÔnaliselt kustutamist ei taotle).
  3. Redis Stream vĂ”imaldab piirata juurdepÀÀsu sĂ”numitele ĂŒhe voolu sees. Konkreetne tellija nĂ€eb ainult oma isiklikku sĂ”numite ajalugu.

Saate voole tellida ja uusi sÔnumeid vastu vÔtta, kasutades kÀsku XREAD. See on natuke keerulisem kui XRANGE, seetÔttu alustame esmalt lihtsamate nÀidetega.

> 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"

Ülaltoodud nĂ€ites on mÀÀratud mitteblokkeeriv vorm XREAD. Pange tĂ€hele, et valik COUNT ei ole kohustuslik. Tegelikult on ainsa kohustusliku valikuna kĂ€skluste seas STREAMS, mis mÀÀrab voogude nimekirja koos vastava maksimaalse tuvastajaga. Me kirjutasime „STREAMS mystream 0“ — me tahame saada kĂ”ik kirjed voost mystream, mille tuvastaja on suurem kui „0-0“. Nagu nĂ€ha nĂ€ites, tagastab kĂ€sk voolu nime, kuna saame tellida mitu voolu korraga. Me oleksime vĂ”inud kirjutada nĂ€iteks „STREAMS mystream otherstream 0 0“. Pange tĂ€hele, et pĂ€rast valikut STREAMS peame esmalt esitama kĂ”ikide vajalike voogude nimed ja alles seejĂ€rel tuvastajate nimekirja.

Selles lihtsas vormis ei tee kÀsk midagi erilist vÔrreldes XRANGE. Kuid huvitav on see, et saame hÔlpsasti muuta XREAD blokeerivaks kÀskuks, mÀÀrates argumendiks BLOCK:

> XREAD BLOCK 0 STREAMS mystream $

Ülaltoodud nĂ€ites on mÀÀratud uus BLOCK valik, mille ooteaeg on 0 millisekundit (see tĂ€hendab lĂ”pmatult oodata). Veelgi enam, selle asemel et edastada tavaline tuvastaja voole mystream, edastati eriline tuvastaja $. See eriline tuvastaja tĂ€hendab, et XREAD tuleb kasutada tuvastajana maksimaalse tuvastajana voos mystream. Nii et me saame uusi sĂ”numeid alates hetkest, mil alustasime kuulamist. Teatud mĂ”ttes on see sarnane Unix'i kĂ€sule „tail -f“.

Pöörake tÀhelepanu, et BLOCK valiku kasutamisel ei pruugi meil olla vaja kasutada erilist identifikaatorit $. Me saame kasutada iga olemasolevat identifikaatorit voos. Kui meeskond suudab meie taotlust kohe teenindada, ilma lukustamata, siis nad teevad seda; vastasel juhul nad lukustuvad.

Lukustav XREAD vÔib samuti jÀlgida mitu voogu korraga, tuleb lihtsalt nÀidata nende nimesid. Sel juhul tagastab meeskond esimese voolu salvestuse, kuhu andmed tulid. Esimene tellija, kes on antud voos lukustatud, saab andmed kÔige varem.

Tellijate grupid

MĂ”nedes ĂŒlesannetes tahame piiritleda tellijate juurdepÀÀsu sĂ”numitele ĂŒhes voos. NĂ€ide, kui see vĂ”ib olla kasulik — sĂ”numite jĂ€rjekord töötajatega, kes saavad erinevaid voosĂ”numeid, vĂ”imaldades sĂ”numite töötlemise skaleerimist.

Kui kujutame ette, et meil on kolm tellijat C1, C2, C3 ja voog, mis sisaldab sÔnumeid 1, 2, 3, 4, 5, 6, 7, siis sÔnumite teenindamine toimub nagu alloleval diagrammil:

1 -> C1
2 -> C2
3 -> C3
4 -> C1
5 -> C2
6 -> C3
7 -> C1

Selle efekti saavutamiseks kasutab Redis Stream kontseptsiooni, mida nimetatakse tellijate grupiks. See kontseptsioon sarnaneb pseudotellijaga, mis saab andmeid voost, kuid tegelikult teenindatakse seda mitme tellijaga grupi sees, pakkudes teatud garanteeringuid:

  1. Iga sÔnum edastatakse erinevatele tellijatele grupi sees.
  2. Grupi siseselt tunnistatakse tellijad nime jÀrgi, mis on suur- ja vÀiketÀhti arvesse vÔtav string. Kui mÔni tellija ajutiselt grupist vÀlja jÀÀb, siis vÔib ta taastuda grupis oma unikaalse nime abil.
  3. Iga tellijate grupp jĂ€rgib kontseptsiooni "esimene lugemata sĂ”num". Kui tellija kĂŒsib uusi sĂ”numeid, vĂ”ib ta saada ainult neid sĂ”numeid, mida pole varem ĂŒhelegi tellijale grupis edastatud.
  4. On olemas kĂ€sk, millega tellija kinnitab sĂ”numi eduka töötlemise. Kuni seda kĂ€sku ei ole kutsutud, jÀÀb kĂŒsitud sĂ”num staatuse „oote“ alla.
  5. Tellijate grupi sees vĂ”ib iga tellija kĂŒsida sĂ”numite ajalugu, mis on talle edastatud, kuid pole veel töödeldud (staatuses „oote“).

Teatud mÔttes vÔib grupi seisundit esitada jÀrgmiselt:

+----------------------------------------+
| consumer_group_name: mygroup          
| consumer_group_stream: somekey        
| last_delivered_id: 1292309234234-92    
|                                                           
| consumers:                                          
|    "consumer-1" ootel sÔnumitega  
|       1292309234234-4                          
|       1292309234232-8                          
|    "consumer-42" ootel sÔnumitega 
|       ... (ja nii edasi)                             
+----------------------------------------+

NĂŒĂŒd on aeg tutvuda peamiste kĂ€skudega Consumer Group'i jaoks, nimelt:

  • XGROUP kasutatakse gruppide loomiseks, hĂ€vitamiseks ja haldamiseks
  • XREADGROUP kasutatakse voogude lugemiseks grupi kaudu
  • XACK — see kĂ€sk vĂ”imaldab tellijal mĂ€rkida sĂ”numi edukalt töödelduna

Consumer Group'i loomine

Oletame, et voog mystream juba eksisteerib. Siis nÀeb grupi loomise kÀsk vÀlja jÀrgmiselt:

> XGROUP CREATE mystream mygroup $
OK

Grupi loomisel peame edastama ID, millest alates grupp hakkab sÔnumeid saama. Kui soovime lihtsalt saada kÔiki uusi sÔnumeid, vÔime kasutada erilist identifikaatorit $ (nagu meie eespool olevas nÀites). Kui selle asemel kasutatakse erilise identifikaatori asemel 0, on grupile saadaval kÔik voogude sÔnumid.

NĂŒĂŒd, kui grupp on loodud, saame kohe hakata sĂ”numeid lugema kasutades kĂ€sku XREADGROUP. See kĂ€sk on vĂ€ga sarnane XREAD ja toetab valikulist valikut BLOCK. Kuid alati tuleb kasutada kohustuslikku valikut GROUP, mis peab olema alati mÀÀratud kahe argumendiga: grupi nimi ja tellija nimi. Valikut COUNT toetatakse samuti.

Enne voogude lugemist paneme sinna mÔned sÔnumid:

> 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

Ja nĂŒĂŒd proovime seda voogu lugeda grupi kaudu:

> XREADGROUP GROUP mygroup Alice COUNT 1 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) 1526569495631-0
         2) 1) "message"
            2) "apple"

Ülaltoodud kĂ€sk ĂŒtleb sĂ”na-sĂ”nalt jĂ€rgmist:

«Mina, Alice-tellija, mygroup'i liikmena, tahan lugeda voost mystream ĂŒhte sĂ”numit, mida ei ole kunagi kellelegi varem edastatud.»

Iga kord, kui tellija teostab operatsiooni grupiga, peab ta mĂ€rkima oma nime, tuvastades ennast grupis. Ülaltoodud kĂ€sus on veel ĂŒks vĂ€ga oluline detail - eriline identifikaator „>”. See eriline identifikaator filtreerib sĂ”numid, jĂ€ttes alles need, mis pole kunagi varem kohale toimetatud.

Samuti vĂ”ite erandlikel juhtudel mĂ€rkida reaalse identifikaatori, nĂ€iteks 0 vĂ”i mĂ”ne muu kehtiva identifikaatori. Sel juhul kĂ€sk XREADGROUP tagastab teile sĂ”numite ajalugu staatusega „ootele”, mis on toimetatud antud tellijale (Alice), kuid pole veel kinnitatud kĂ€suga XACK.

Saame seda kĂ€itumist kontrollida, mĂ€rkides kohe identifikaatori 0, ilma valikuta LOEND. NĂ€eme lihtsalt ĂŒhte ainsat ootel sĂ”numit, nimelt sĂ”numit Ă”unast:

> XREADGROUP GROUP mygroup Alice STREAMS mystream 0
1) 1) "mystream"
   2) 1) 1) 1526569495631-0
         2) 1) "sÔnum"
            2) "Ôun"

Kuid kui kinnitame sÔnumi edukalt töödelduna, ei kuvata seda enam:

> XACK mystream mygroup 1526569495631-0
(integer) 1
> XREADGROUP GROUP mygroup Alice STREAMS mystream 0
1) 1) "mystream"
   2) (tĂŒhi loend vĂ”i kogum)

NĂŒĂŒd on Bobil aeg midagi lugeda:

> XREADGROUP GROUP mygroup Bob COUNT 2 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) 1526569498055-0
         2) 1) "sÔnum"
            2) "apelsin"
      2) 1) 1526569506935-0
         2) 1) "sÔnum"
            2) "maasikas"

Bob, mygroup'i liige, kĂŒsis mitte rohkem kui kahte sĂ”numit. KĂ€sk raporteerib vaid kohale toimetamata sĂ”numeid erilise identifikaatori „>” tĂ”ttu. Nagu nĂ€ete, ei kuvata sĂ”numit „Ôun”, kuna see on juba Alicele toimetatud, seetĂ”ttu saab Bob „apelsini” ja „maasika”.

Nii saavad Alice, Bob ja iga teine grupi tellija lugeda erinevaid sĂ”numeid ĂŒhest ja samast voogust. Samuti saavad nad lugeda oma töödeldud sĂ”numite ajalugu vĂ”i mĂ€rkida sĂ”numeid töödelduna.

On mÔned asjad, mida tasub meeles pidada:

  • Kui tellija loeb sĂ”numit kĂ€suga XREADGROUP, liigub see sĂ”num olekusse „ootele” ja kinnitatakse selle konkreetse tellija alla. Teised grupi tellijad ei saa seda sĂ”numit lugeda.
  • Tellijad luuakse automaatselt esmakordsel mainimisel, ei ole vaja neid eraldi luua.
  • EL-i abil XREADGROUP Saate lugeda teateid mitmest erinevast voost samaaegselt, kuid selleks peab teil eelnevalt olema loodud rĂŒhmad, millel on iga voolu jaoks sama nimi, kasutades XGROUP

TÔrke taastamine

Tellija vĂ”ib taastuda tĂ”rkest ja lugeda oma sĂ”numite loendit, mille olek on "pending". Kuid tegelikus maailmas vĂ”ivad tellijad jÀÀda pĂŒsivalt ebaĂ”nnestunuks. Mis juhtub tellija ootereĆŸiimis olevate sĂ”numitega, kui ta ei suuda tĂ”rget taastada?
Kasutajagrupi funktsioon pakub lahendust selliste juhtumite jaoks — kui on vajalik sĂ”numite omandi Ă”iguse vahetamine.

Esiteks tuleb kĂ€ivitada kĂ€sk XPENDING, mis kuvab kĂ”ik rĂŒhma sĂ”numid olekuga "pending". Oma kĂ”ige lihtsamas vormis kĂ€ivitatakse kĂ€sk vaid kahe argumendiga: voolu nimi ja rĂŒhma nimi:

> XPENDING mystream mygroup
1) (integer) 2
2) 1526569498055-0
3) 1526569506935-0
4) 1) 1) "Bob"
      2) "2"

KĂ€sk trĂŒkib vĂ€lja töötlemata sĂ”numite arvu kogu grupi ja iga tellija jaoks. Meil on ainult Bob, kellel on kaks töötlemata sĂ”numit, kuna Alice'i taotletud ainus sĂ”num kinnitati lĂ€bi XACK.

Saame kĂŒsida lisainfot, kasutades rohkem argumente:

XPENDING {key} {groupname} [{start-id} {end-id} {count} [{consumer-name}]]

{start-id} {end-id} — identifikaatorite vahemik (vĂ”ib kasutada "-" ja "+")
{count} — katsete arv
{consumer-name} — rĂŒhma nimi

> 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

NĂŒĂŒd on meil iga sĂ”numi kohta ĂŒksikasjad: identifikaator, tellija nimi, ooteaeg millisekundites ning lĂ”puks katsete arv. Meil on kaks sĂ”numit Bobilt, mis ootavad 74170458 millisekundit, umbes 20 tundi.

Pange tÀhele, et ei miski takista meil kontrollida, milline oli sÔnumite sisu, kasutades lihtsalt XRANGE.

> XRANGE mystream 1526569498055-0 1526569498055-0
1) 1) 1526569498055-0
   2) 1) "message"
      2) "orange"

Peame lihtsalt kordama sama identifikaatorit kaks korda argumentides. NĂŒĂŒd, kui meil on mingi ettekujutus, vĂ”ib Alice jĂ€reldada, et pĂ€rast 20 tunni ootamist ei taastu Bob tĂ”enĂ€oliselt ning on aeg need sĂ”numid taotleda ja nende töötlemisega jĂ€tkata Bobi asemel. Selleks kasutame kĂ€sku XCLAIM:

XCLAIM {key} {group} {consumer} {min-idle-time} {ID-1} {ID-2} ... {ID-N}

Selle kĂ€su abil saame hankida «vÔÔra» sĂ”numi, mis pole veel töödeldud, muutes omaniku {consumer} -iks. Samuti saame pakkuda minimaalset seismisaega {min-idle-time}. See aitab vĂ€ltida olukorda, kus kaks klienti ĂŒritavad samal ajal sama sĂ”numi omaniku vahetada:

Kliendi 1: XCLAIM mystream mygroup Alice 3600000 1526569498055-0
Kliendi 2: XCLAIM mystream mygroup Lora 3600000 1526569498055-0

Esimene klient nullib seismisaja ja suurendab kohaletoimetamise arvu loendurit. Seega ei saa teine klient seda nÔuda.

> XCLAIM mystream mygroup Alice 3600000 1526569498055-0
1) 1) 1526569498055-0
   2) 1) "sÔnum"
      2) "oranĆŸ"

SĂ”num on edukalt nĂ”udnud Alice, kes nĂŒĂŒd saab sĂ”numit töödelda ja kinnitada.

Ülalkirjeldatud nĂ€itest on nĂ€ha, et eduka pĂ€ringu tĂ€itmine tagastab sĂ”numi sisu. Kuid see pole kohustuslik. Opetsioon JUSTID saab kasutada ainult sĂ”numi id-de tagastamiseks. See on kasulik, kui teid ei huvita sĂ”numi detailid ja soovite sĂŒsteemi jĂ”udlust suurendada.

Kohaletoimetamise loendur

Loendur, mida nĂ€ete vĂ€ljundis XPENDING — on iga sĂ”numi kohaletoimetamiste arv. See loendur suureneb kahel viisil: kui sĂ”num on edukalt taotletud lĂ€bi XCLAIM vĂ”i kui kasutatakse kutset XREADGROUP.

On normaalne, et mĂ”ned sĂ”numid toimetatakse mitu korda. Peamine on see, et kĂ”ik sĂ”numid oleksid lĂ”puks töödeldud. MĂ”nikord tekivad probleeme sĂ”numi töötlemisel, mis tulenevad sĂ”numi enda kahjustumisest vĂ”i sĂ”numi töötlemine tekitab töötleja koodi vea. Sellisel juhul vĂ”ib juhtuda, et seda sĂ”numit ei saa keegi töödelda. Kuna meil on kohaletoimetamise katsete loendur, saame seda loendurit kasutada selliste olukordade tuvastamiseks. SeetĂ”ttu, kui kohaletoimetamiste loendur saavutab teie mÀÀratud suure numbri, on tĂ”enĂ€oliselt mĂ”istlik selline sĂ”num viia teise voogude ja saata sĂŒsteemiadministraatorile teade.

Voolude olek

Meeskond XINFO kasutatakse voolu ja selle gruppide erineva teabe pÀrimiseks. NÀiteks nÀeb kÀsu pÔhivÀlimus jÀrgmine vÀlja:

> 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) "sÔnum"
       2) "banaan"

Ülemine kĂ€sk nĂ€itab mÀÀratud voogu ĂŒldteavet. NĂŒĂŒd veidi keerulisem nĂ€ide:

> XINFO GROUPS mystream
1) 1) nimi
   2) "mygroup"
   3) tarbijad
   4) (tÀisarv) 2
   5) ootel
   6) (tÀisarv) 2
2) 1) nimi
   2) "some-other-group"
   3) tarbijad
   4) (tÀisarv) 1
   5) ootel
   6) (tÀisarv) 0

Ülemine kĂ€sk nĂ€itab kĂ”igi mÀÀratud voogu grupi ĂŒldteavet.

> XINFO CONSUMERS mystream mygroup
1) 1) nimi
   2) "Alice"
   3) ootel
   4) (tÀisarv) 1
   5) mitteaktiivne
   6) (tÀisarv) 9104628
2) 1) nimi
   2) "Bob"
   3) ootel
   4) (tÀisarv) 1
   5) mitteaktiivne
   6) (tÀisarv) 83841983

Ülemine kĂ€sk nĂ€itab teavet kĂ”igi mÀÀratud voogu ja grupi tellijate kohta.
Kui unustate kĂ€skluse sĂŒntaksi, puudutage lihtsalt abi saamiseks kĂ€sku ise:

> XINFO HELP
1) XINFO {alampÀring} arg arg ... arg. AlamkÀsklused on:
2) CONSUMERS {vÔti} {grupi nimi}  -- NÀita grupi {grupi nimi} tarbijagrupe.
3) GROUPS {vÔti}                 -- NÀita voogu tarbijagrupe.
4) STREAM {vÔti}                 -- NÀita teavet voo kohta.
5) HELP                         -- Prindi see abi.

Voo suuruse piirang

Paljud rakendused ei soovi koguda andmeid voogu igavesti. Sageli on kasulik omada maksimaalset lubatud sĂ”numite arvu voos. Teistes olukordades on kasulik edastada kĂ”ik sĂ”numid voost teise pĂŒsivasse salvestusse, kui sĂ€testatud voosuurus on saavutatud. Voo suurust saab piirata MAXLEN parameetriga kĂ€sus. XADD:

> XADD mystream MAXLEN 2 * vÀÀrtus 1
1526654998691-0
> XADD mystream MAXLEN 2 * vÀÀrtus 2
1526654999635-0
> XADD mystream MAXLEN 2 * vÀÀrtus 3
1526655000369-0
> XLEN mystream
(tÀisarv) 2
> XRANGE mystream - +
1) 1) 1526654999635-0
   2) 1) "vÀÀrtus"
      2) "2"
2) 1) 1526655000369-0
   2) 1) "vÀÀrtus"
      2) "3"

MAXLENi kasutamisel kustutatakse vanad kirjed automaatselt, kui mÀÀratud pikkus on saavutatud, seega on voog alaliselt suurusega. Kuid lÔikamine ei toimu kÔige tÔhusamal viisil Redis mÀlus. Seda olukorda saab parandada jÀrgmiselt:

XADD mystream MAXLEN ~ 1000 * ... kirjevÀljad siia ...

Argument ~ ĂŒlaltoodud nĂ€ites tĂ€hendab, et meil ei ole tingimata vaja voogu piirata kindla vÀÀrtusega. Meie nĂ€ites vĂ”ib see olla mis tahes number, mis on suurem vĂ”i vĂ”rdne 1000 (nĂ€iteks 1000, 1010 vĂ”i 1030). Lihtsalt oleme selgelt öelnud, et soovime, et meie voog salvestaks vĂ€hemalt 1000 kirjet. See muudab mĂ€lu haldamise palju tĂ”husamaks Redis'is.

Olemas on ka eraldi kĂ€sk XTRIM, mis tĂ€idab sama ĂŒlesannet:

> XTRIM mystream MAXLEN 10

> XTRIM mystream MAXLEN ~ 10

PĂŒsiv salvestamine ja replikatsioon

Redis Stream asĂŒnkroonselt replikeeritakse slave sĂ”lmedele ning salvestatakse AOF (kĂ”igi andmete momentne seis) ja RDB (kĂ”ikide kirjutamisoperatsioonide logi) failidesse. Samuti toetatakse Consumer Groups'i oleku replikeerimist. Seega, kui sĂ”num on master sĂ”lmes staatuses „pending“, siis slave sĂ”lmedes on sellel sĂ”numil sama staatus.

Üksikute elementide eemaldamine voost

SÔnumite eemaldamiseks on olemas spetsiaalne kÀsk XDEL. KÀsk vÔtab vastu voolu nime, millele jÀrgneb sÔnumite identifikaatorid, mille tuleb eemaldada:

> 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"

Seda kÀsku kasutades tuleb arvestada, et mÀlu vabastamine ei toimu kohe.

Nullpikkusega vood

Erinevus voogude ja muude Redis'i andmestruktuuride vahel seisneb selles, et kui teised andmestruktuurid ei sisalda enam elemente, eemaldatakse andmestruktuur ise mĂ€lust kĂ”rvaltoimena. NĂ€iteks, jĂ€rjestatud kogum eemaldatakse tĂ€ielikult, kui ZREM kĂ€sk eemaldab viimase elemendi. Vastupidi, vood vĂ”ivad jÀÀda mĂ€llu, isegi kui need ei sisalda ĂŒhtegi elementi.

KokkuvÔte

Redis Stream sobib ideaalselt sĂ”numitevahetuse vahendite, sĂ”numijĂ€rjekordade, ĂŒhtsete ajakirjade ja vestlussĂŒsteemide, mis salvestavad ajalugu, loomiseks.

Kuidas ĂŒtles kunagi Niklaus Wirth, programmid — see on algoritmid pluss andmestruktuurid, ja Redis annab teile juba mĂ”lemat.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster