
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:
- 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.
- 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).
- 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:
- Iga sÔnum edastatakse erinevatele tellijatele grupi sees.
- 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.
- 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.
- 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.
- 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 , programmid â see on algoritmid pluss andmestruktuurid, ja Redis annab teile juba mĂ”lemat.
Allikas: habr.com
