
Redis Stream â uus abstraktne andmetĂŒĂŒp, mis esitati Redis versiooniga 5.0
Kontseptsiooniliselt on Redis Stream nagu List, kuhu saate teha kirjeid. Igal kirjel on ainulaadne identifikaator. Vaikimisi genereeritakse identifikaator automaatselt ja sisaldab ajatemplit. SeetĂ”ttu saate taotleda kirjeid ajavahemike kaupa vĂ”i saada uusi andmeid voos, nagu Unix kĂ€sk âtail -fâ loeb logifaili ja ootab uusi andmeid. Pange tĂ€hele, et voogu vĂ”ivad korraga kuulata mitu klienti, just nagu paljud âtail -fâ protsessid saavad samal ajal faili lugeda, omavahel konfliktsitamata.
Uue andmetĂŒĂŒbi kĂ”iki eeliseid mĂ”istmiseks tuletame meelde vanemaid Redis struktuure, mis osaliselt kordavad Redis Stream funktsionaalsust.
Redis PUB/SUB
Redis Pub/Sub on lihtne sĂ”numisĂŒsteem, mis on juba teie key-value salvesse integreeritud. Kuid lihtsuse eest tuleb maksta:
- Kui publisher mingil pÔhjusel ebaÔnnestub, siis kaotab ta kÔik oma tellijad.
- Publisher peab teadma kÔigi oma tellijate tÀpset aadressi.
- VÀljaandja vÔib koormata oma tellijaid, kui andmed avaldatakse kiiremini, kui neid töödeldakse.
- SÔnum eemaldatakse vÀljaandja puhvrist kohe pÀrast avaldamist, sÔltumata sellest, kui paljudele tellijatele see toimitakse ja kui kiiresti nad suudavad selle sÔnumi töödelda.
- KÔik tellijad saavad sÔnumi samal ajal. Tellijad peavad omavahel kuidagi kokku leppima sama sÔnumi töötlemise jÀrjekorras.
- Ei ole sisseehitatud mehhanismi tellijate sÔnumi eduka töötlemise kinnitamiseks. Kui tellija saab sÔnumi ja katkee töötlemise ajal, ei saa vÀljaandja sellest teada.
Redis List
Redis List on andmestruktuur, mis toetab lukustamisega lugemis kĂ€ske. Saate lisada ja lugeda sĂ”numeid nimekirja algusest vĂ”i lĂ”pust. Selle struktuuri pĂ”hjal on vĂ”imalik luua hea virn vĂ”i jĂ€rjekord teie jaotatud sĂŒsteemile ning seda on enamasti piisavalt. Peamised erinevused Redis Pub/Sub-ist:
- SĂ”num toimetatakse ĂŒhele kliendile. Esimene lukustatud lugemisega klient saab andmed esimesena.
- Klient peab iga sÔnumi lugemise operatsiooni ise algatama. List ei tea klientidest midagi.
- SĂ”numid sĂ€ilivad kuni need keegi loeb vĂ”i ei kustutata selgesĂ”naliselt. Kui olete seadistanud Redis serveri andmete ketasse salvestamiseks, suureneb sĂŒsteemi usaldusvÀÀrtus jĂ€rsult.
Sissejuhatus voogu
Salvestuse lisamine voogu
Meeskond XADD lisab voogu uue salvestuse. Salvestus ei ole lihtsalt rida, see koosneb ĂŒhest vĂ”i mitmest vĂ”tme-vÀÀrtuse paarist. Seega on iga salvestus juba struktureeritud ja meenutab CSV faili struktuuri.
> XADD mystream * sensor-id 1234 temperature 19.8
1518951480106-0
Ălaltoodud nĂ€ites lisame nimega (vĂ”tmega) 'mystream' voogu kaks vĂ€ljad: 'sensor-id' ja 'temperature' vÀÀrtustega '1234' ja '19.8'. Teise argumendina aktsepteerib kĂ€sk identifikaatorit, mis antakse kirjele â see identifikaator mÀÀratleb iga kirje voos ĂŒheselt. Kuid kĂ€esoleval juhul edastasime *, kuna soovime, et Redis genereeriks meile uue identifikaatori. Iga uus identifikaator suureneb, seega on igal uuel kirjel suurem identifikaator vĂ”rreldes eelnevate kirjadega.
Identifikaatori formaat
KĂ€sklusest tagastatud kirje identifikaator XADD, koosneb kahest osast:
{millisecondsTime}-{sequenceNumber}
millisecondsTime â Unix-aeg millisekundites (ajakood Redis). Kui aga praegune aeg osutub eelneva kirje ajast samaks vĂ”i vĂ€iksemaks, kasutatakse eelneva kirje ajamĂ€rki. Seega, kui serveri aeg tagastatakse minevikku, siis uus identifikaator sĂ€ilitab endiselt suureneva omaduse. serverile Redis). Kuid kui praegune aeg osutub sama vĂ”i vĂ€iksemaks kui eelneva kirje aeg, kasutatakse eelneva kirje ajatemplit. Seega, kui serveri aeg lĂ€heb minevikku, sĂ€ilitab uus identifikaator endiselt kasvamise omaduse.
sequenceNumber kasutatakse ĂŒhe ja sama millisekundi jooksul loodud kirjete puhul. sequenceNumber suurendatakse 1 vĂ”rreldes eelneva kirje numbriga. Kuna sequenceNumber on 64 biti suurune, siis praktikas ei tohiks te sattuda piirangusse selle kohta, kui palju kirjeid saab ĂŒhe millisekundi jooksul genereerida.
Selliste tuvastajate formaat vĂ”ib esmapilgul tunduda kummaline. Skeptiline lugeja vĂ”ib kĂŒsida, miks aeg on osa tuvastajast. PĂ”hjus on see, et Redis vood toetavad vahemiku pĂ€ringuid tuvastajate jĂ€rgi. Kuna tuvastaja on seotud kirje loomise ajaga, siis vĂ”imaldab see kĂŒsida ajavahemikke. Toome vĂ€lja konkreetse nĂ€ite, kui liigume edasi kĂ€sitsi, XRANGE.
Kui kasutajal on mingil pĂ”hjusel vaja mÀÀrata oma tuvastaja, mis on nĂ€iteks seotud mĂ”ne vĂ€list sĂŒsteemiga, saame 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 tuvastaja suurendamist. Meie nĂ€ites on minimaalne tuvastaja â0-1â, seega ei aktsepteeri kĂ€sk veel ĂŒhte tuvastajat, mis on vĂ”rdne vĂ”i vĂ€iksem kui â0-1â.
> XADD somestream 0-1 foo bar
(error) ERR MÀÀratud ID XADD on vĂ”rdne vĂ”i vĂ€iksem sihtvoo ĂŒlemisest elemendist
Kirjete arv voos
VÔite voos olevate kirjeid saada, kasutades lihtsalt kÀsku XLEN. Meie nÀite jaoks tagastab see kÀsk jÀrgmise vÀÀrtuse:
> XLEN somestream
(integer) 2
KĂŒsimused vahemiku jĂ€rgi â XRANGE ja XREVRANGE
Et kĂŒsida andmeid vahemiku jĂ€rgi, peame mÀÀrama kaks identifikaatorit â vahemiku algus ja lĂ”pp. Tagastatav vahemik sisaldab kĂ”iki elemente, sealhulgas piire. Samuti on olemas kaks erilise identifikaatorit «-» ja «+», mis vastavad vastavalt kĂ”ige vĂ€iksemale (esimene kirje) ja kĂ”ige suuremale (viimane kirje) identifikaatorile voos. Allolev nĂ€ide kuvab voos kĂ”ik kirjed.
> 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 tagastatav kirje on kahest elemendist koosnev massiiv: ID ja vĂ”tme-vÀÀrtuse paaride loend. Oleme juba maininud, et kirje id-d on ajaga seotud. SeetĂ”ttu saame kĂŒsida konkreetse ajavahemiku ulatust. Siiski saame pĂ€ringus nĂ€idata mitte tĂ€is id-d, vaid ainult Unix-aega, jĂ€ttes vĂ€lja osa, mis seondub sequenceNumber. VĂ€lja jĂ€etud osa id-st omistatakse automaatselt nulliks ulatuse alguses ja maksimaalsele vĂ”imalikule vÀÀrtusele ulatuse lĂ”pus. Allpool on nĂ€ide, kuidas kĂŒsida kahe millisekundi ulatust.
> XRANGE mystream 1518951480106 1518951480107
1) 1) 1518951480106-0
2) 1) "sensor-id"
2) "1234"
3) "temperature"
4) "19.8"
Meil on sellel ulatusel ainult ĂŒks kirje, kuid reaalses andmekogus vĂ”ib tagastatav tulemus olla tohutu. Just sellepĂ€rast XRANGE toetab COUNT valikut. TĂ€ites arv, saame lihtsalt vastu vĂ”tta esimesed N kirjet. Kui peame saama jĂ€rgmised N kirjet (lehtede vahel navigeerimine), saame kasutada viimati saadud id-d ja suurendada seda sequenceNumber ĂŒksuse ja kĂŒsida uuesti. Vaadakem seda jĂ€rgmises nĂ€ites. Alustame 10 elemendi lisamisega XADD (eeldades, et voog mystream on juba tĂ€idetud 10 elemendiga). Itereerimise alustamiseks, saades iga kĂ€sku 2 elementi, alustame tĂ€ielikust vahemikust, kuid COUNTiga, mis on 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"
Et jÀtkata iteratsiooni jÀrgmiste kahe elemendiga, peame valima viimase saadud identifikaatori, st 1519073279157-0, ja lisama 1 sequenceNumber.
Saadav identifikaator, antud juhul 1519073279157-1, vĂ”ib nĂŒĂŒd kasutada uue vahemiku algusargumendina jĂ€rgmise kutse jaoks 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)) otsimise jaoks ja seejÀrel O(M) M elemendi tagastamiseks, on iga iteratsiooni samm kiire. Seega, kasutades XRANGE on vÔimalik tÔhusalt vooge iteratsiooni teha.
Meeskond XREVRANGE on vÔrdne XRANGE, kuid tagastab elemendid vastupidises jÀrjekorras:
> XREVRANGE mystream + - COUNT 1
1) 1) 1519073287312-0
2) 1) "foo"
2) "value_10"
MÀrge, et kÀsk XREVRANGE vÔtab argumentide vahemiku start ja stop vastupidises jÀrjekorras.
Uute kirjeid lugemine XREAD abil
Tihti tekib vajadus tellida voog ja saada ainult uusi sÔnumeid. See kontseptsioon vÔib tunduda sarnane Redis Pub/Sub-ile vÔi tÔkestava Redis List-i suhtes, kuid Redis Streami kasutamise viisid on pÔhimÔtteliselt erinevad:
- Iga uus sĂ”num saadetakse vaikimisi iga tellijani. See kĂ€itumine erineb tĂ”kestavast Redis List-ist, kus uut sĂ”numit loeb ainult ĂŒks tellija.
- Samal ajal, kui Redis Pub/Sub unustab kÔik sÔnumid ja ei salvesta neid kunagi, salvestatakse Streamis kÔik sÔnumid mÀÀramatuks ajaks (kui klient seda selgesÔnaliselt ei tuvasta).
- Redis Stream vĂ”imaldab piirduda sĂ”numite juurdepÀÀsuga ĂŒhes voos. Spetsiifiline tellija nĂ€eb ainult oma isiklikku sĂ”numite ajalugu.
VÔite tellida voogu ja saada uusi sÔnumeid, kasutades kÀsku XREAD. See on veidi keerulisem kui XRANGE, seega alustame alguses lihtsamate nÀidete abil.
> 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"
Eeltoodud nĂ€ites on toodud mitteblokeeriv vorm. XREADPange tĂ€hele, et valik COUNT ei ole kohustuslik. Tegelikult on ainus kohustuslik valik kĂ€sus STREAMS, mis mÀÀrab voogude nimekirja koos vastava maksimaalse identifikaatoriga. Oleme kirjutanud «STREAMS mystream 0» â me tahame saada kĂ”ik kirjed voos mystream, mille identifikaator on suurem kui «0-0». Nagu nĂ€ha nĂ€ites, tagastab kĂ€sk voonime, kuna saame samal ajal liituda mitme vooga. Oleme vĂ”inud kirjutada nĂ€iteks «STREAMS mystream otherstream 0 0». Pange tĂ€hele, et pĂ€rast valikut STREAMS peame esmalt esitama kĂ”igi vajalike voogude nimed ja seejĂ€rel identifikaatorite loendi.
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 argumendi BLOCK:
> XREAD BLOCK 0 STREAMS mystream $
Eespool toodud nÀites on uus BLOCK valik, mille ooteaeg on 0 millisekundit (see tÀhendab lÔputut ootamist). Veelgi enam, tavapÀrase mystream voolu identifikaatori edastamise asemel edastati spetsiaalne identifikaator $. See spetsiaalne identifikaator tÀhistab, et XREAD peame kasutama maksimaalset identifikaatorit voolus mystream. Nii et me saame ainult uusi sÔnumeid alates hetkest, mil alustasime kuulamist. Teatud mÀÀral sarnaneb see Unix kÀsuga «tail -f».
Pange tÀhele, et BLOCK valiku kasutamisel ei ole meil tingimata vaja kasutada spetsiaalset identifikaatorit $. Me vÔime kasutada mistahes olemasolevat voolu identifikaatorit. Kui kÀsk suudab meie soovi kohe tÀita, ilma blokeerimiseta, teeb ta seda; vastasel juhul blokeerib ta.
Blokeeriv XREAD saab samuti kuulata mitut voolu korraga, lihtsalt tuleb nende nimed mÀÀrata. Sel juhul tagastab kÀsk esimese voolu kirje, kuhu andmed saabusid. Esimene uusi andmeid blokeeritud tellija antud voolus saab andmeid esimesena.
Tarbijagrupp
Teatud ĂŒlesannetes soovime piirata tellijate juurdepÀÀsu sĂ”numitele ĂŒhes voos. NĂ€ide, kui see vĂ”ib olla kasulik, on sĂ”numijĂ€rjekord töötajatega, kes saavad voost erinevaid sĂ”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 Tarbijagrupiks. See kontseptsioon on sarnane pseudo-tellijaga, kes saab andmeid voost, kuid seda teenindab tegelikult mitu tellijat grupi sees, pakkudes teatud garanteeritud omadusi:
- Iga sÔnum toimetatakse erinevatele tellijatele grupi sees.
- Grupi sees identifitseeritakse tellijad nime jÀrgi, mis on juhtumiselt suur- ja vÀiketÀhtedega. Kui mÔni tellija jÀÀb grupist ajutiselt vÀlja, vÔib ta taastuda grupis oma ainulaadse nime kaudu.
- Iga Consumer Group jĂ€rgib pĂ”himĂ”tet âesimene lugemata sĂ”numâ. Kui tellija kĂŒsib uusi sĂ”numeid, saab ta ainult need sĂ”numid, mida pole kunagi varem ĂŒhelegi tellijale grupis edastatud.
- On olemas selge kĂ€su sĂŒsteem, et kinnitada sĂ”numi edastamise edukust tellijale. Kuni seda kĂ€sku ei kutsuta, jÀÀb kĂŒsitud sĂ”num olekusse âpendingâ.
- Iga tellija Consumer Group'i sees vĂ”ib kĂŒsida sĂ”numite ajalugu, mis on just tema jaoks edastatud, kuid ei ole veel töödeldud (olekus âpendingâ).
Teatud mÔttes vÔib grupi olekut esitada jÀrgmiselt:
+----------------------------------------+
| consumer_group_name: mygroup
| consumer_group_stream: somekey
| last_delivered_id: 1292309234234-92
|
| consumers:
| "consumer-1" with pending messages
| 1292309234234-4
| 1292309234232-8
| "consumer-42" with pending messages
| ... (and so forth)
+----------------------------------------+
NĂŒĂŒd on aeg tutvuda peamiste kĂ€skudega Consumer Group'i jaoks, nimelt:
- XGROUP kasutatakse gruppide loomise, hÀvitamise ja haldamise jaoks
- XREADGROUP kasutatakse vooge gruppi lugemiseks
- XACK â see kĂ€sk vĂ”imaldab tellijal mĂ€rgistada sĂ”num edukalt töödelduna
Consumer Group'i loomine
Oletame, et voog mystream juba eksisteerib. Siis nÀeb grupi loomise kÀsk vÀlja nii:
> XGROUP CREATE mystream mygroup $
OK
Grupi loomisel peame edastama ID, millest alates grupp hakkab sĂ”numeid saama. Kui soovime lihtsalt saada kĂ”ik uued sĂ”numid, saame kasutada spetsiaalset ID-d $, nagu meie ĂŒlaltoodud nĂ€ites. Kui spetsiaalse ID asemel mÀÀratakse 0, on grupile saadaval kĂ”ik vooge sĂ”numid.
NĂŒĂŒd, kui grupp on loodud, saame kohe alustada sĂ”numite lugemist kĂ€suga XREADGROUP. See kĂ€sk on vĂ€ga sarnane XREAD ja toetab valikulist vĂ”imalust BLOCK. Kuid on olemas kohustuslik valik GROUP, mis peab alati olema mÀÀratud kahe argumendiga: grupi nimi ja tellija nimi. Valik COUNT on samuti toetatud.
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
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, rĂŒhmaliige mygroup, tahan lugeda voost mystream ĂŒht sĂ”numit, mis pole kellelegi varem kohale toimetatud.â
Iga kord, kui tellija sooritab grupiga tehingu, peab ta ĂŒtlema oma nime, selgelt tuvastades end grupis. Ălaltoodud kĂ€es on veel ĂŒks vĂ€ga oluline detail â eriline identifikaator â>â. See eriline identifikaator filterdab sĂ”numeid, jĂ€ttes alles ainult need, mis ei ole veel kunagi kohale toimetatud.
Samuti, erilistel juhtudel, vĂ”ite mĂ€rkida tĂ”elise identifikaatori, nagu 0 vĂ”i mĂ”ni muu kehtiv identifikaator. Sel juhul kĂ€sk XREADGROUP tagastab teile sĂ”numite ajalugu, mille staatuseks on âpendingâ, mis on saadetud mÀÀratud tellijale (Alice), kuid mida pole veel kinnitatud kĂ€suga. XACK.
Saame seda kĂ€itumist kontrollida, mÀÀrates kohe identifikaatori 0, ilma valikuta. COUNTNĂ€eme ainult ĂŒhte ootel sĂ”numit, mis on sĂ”num Ă”unaga:
> XREADGROUP GROUP mygroup Alice STREAMS mystream 0
1) 1) "mystream"
2) 1) 1) 1526569495631-0
2) 1) "sÔnum"
2) "Ôun"
Kui me kinnitame sÔnumi kui edukalt töödeldud, siis see enam ei kuvata:
> 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) "oranĆŸ"
2) 1) 1526569506935-0
2) 1) "sÔnum"
2) "maasikas"
Bob, mygroupi liige, palus mitte rohkem kui kahte sĂ”numit. KĂ€sk teatab ainult mitte kohaletoimetatud sĂ”numitest spetsiaalse identifikaatori â>â tĂ”ttu. Nagu nĂ€ete, sĂ”num âĂ”unâ ei kuvata, kuna see on juba Alice'le saadetud, seega saab Bob sĂ”numid âoranĆŸâ ja âmaasikasâ.
Seega saavad Alice, Bob ja iga teine grupi tellija lugeda erinevaid sÔnumeid samast voost. Samuti saavad nad lugeda oma töötlemata sÔnumite ajalugu vÔi mÀrgistada sÔnumeid kui töödeldud.
On mitmeid asju, mida tuleb meeles pidada:
- Kuni tellija loeb sÔnumit kÀsuna, XREADGROUP, lÀheb see sÔnum seisundisse 'ootel' ja seondub selle konkreetse tellijaga. Grupi teised tellijad ei saa seda sÔnumit lugeda.
- Tellijad luuakse automaatselt esimese mainimise korral, nende selgesÔnaline loomine ei ole vajalik.
- KĂ€esoleva abil XREADGROUP saate lugeda sĂ”numeid mitmest erinevast voost korraga, kuid selleks, et see toimiks, peate eelnevalt looma rĂŒhmad sama nimega iga voog jaoks kasutades XGROUP
Taasteprotsess
Tellija saab pĂ€rast tĂ”rket taastuda ja uuesti lugeda oma 'ootele' seisundiga sĂ”numite nimekirja. Siiski vĂ”ivad reaalses maailmas tellijad lĂ”puks ebaĂ”nnestuda. Mis juhtub tellija kĂŒlmutatud sĂ”numitega, kui ta ei suutnud pĂ€rast tĂ”rket taastuda?
Consumer Group pakub funktsiooni, mis on mĂ”eldud just selliste olukordade jaoks â kui on vajalik sĂ”numite omandiĂ”iguse vahetamine.
Esmalt tuleb kutsuda kĂ€sk XPENDING, mis kuvab kĂ”ik grupi sĂ”numid, mille seisund on âpendingâ. Lihtsaimas vormis kutsutakse kĂ€sku ainult kahe argumendiga: voolu nimi ja grupi nimi:
> XPENDING mystream mygroup
1) (integer) 2
2) 1526569498055-0
3) 1526569506935-0
4) 1) 1) "Bob"
2) "2"
KĂ€sk vĂ€ljastas töötlemata sĂ”numite arvu kogu grupi ja iga tellija jaoks. Meil on ainult Bob, kellel on kaks töötlemata sĂ”numit, sest ainus sĂ”num, mille Alice kĂŒsis, kinnitati. XACK.
Saame kĂŒsida lisainfot, kasutades rohkem argumente:
OOTE {key} {groupname} [{start-id} {end-id} {count} [{consumer-name}]]
{start-id} {end-id} â identifikaatorite vahemik (saab kasutada â-â ja â+â)
{count} â proovide kohaletoimetamise arv
{consumer-name} â grupi 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, seisaku aeg millisekundites ja lĂ”puks kohaletoimetamise katsete arv. Meil on kaks sĂ”numit Bobilt, mis on olnud seisakus 74170458 millisekundit, umbes 20 tundi.
Pange tÀhele, et miski ei takista meil kontrollimast, mis sÔnumi sisu oli, kasutades lihtsalt XRANGE.
> XRANGE mystream 1526569498055-0 1526569498055-0
1) 1) 1526569498055-0
2) 1) "sÔnum"
2) "apelsin"
Me peame lihtsalt sama identifikaatori argumentides kaks korda kordama. NĂŒĂŒd, kui meil on mingisugune ettekujutus, vĂ”ib Alice otsustada, et pĂ€rast 20-tunnist seisakut ei taastu Bob tĂ”enĂ€oliselt ja on aeg kĂŒsida neid sĂ”numeid ja jĂ€tkata nende töötlemist Bobi asemel. Selleks kasutame kĂ€sku XCLAIM:
XCLAIM {key} {group} {consumer} {min-idle-time} {ID-1} {ID-2} ... {ID-N}
Selle kĂ€sku abil saame hankida "vÔÔra" sĂ”numi, mida pole veel töödeldud, muutes omanikku {consumer}. Samuti saame esitada minimaalne seisaku aeg {min-idle-time}. See aitab vĂ€ltida olukorda, kus kaks klienti ĂŒritavad samaaegselt sama sĂ”numi omaniku vahetada:
Klient 1: XCLAIM mystream mygroup Alice 3600000 1526569498055-0
Klient 2: XCLAIM mystream mygroup Lora 3600000 1526569498055-0
Esimene klient vÀhendab seisakuid ja suurendab kohaletoimetamiste arvu. Teiseks kliendiks ei saa ta seda nÔuda.
> XCLAIM mystream mygroup Alice 3600000 1526569498055-0
1) 1) 1526569498055-0
2) 1) "message"
2) "orange"
SĂ”num on Alica poolt edukalt nĂ”utud, kes nĂŒĂŒd saab sĂ”numit töödelda ja kinnitada.
Ălaltoodud nĂ€itest on nĂ€ha, et edukas pĂ€ring tagastab sĂ”numi sisu. Kuid see ei ole kindlasti vajalik. JUSTID valikut saab kasutada ainult sĂ”numi identifikaatorite tagastamiseks. See on kasulik, kui te ei ole sĂ”numi detailidest huvitatud ja soovite sĂŒsteemi jĂ”udlust suurendada.
Kohaletoimetamise arvesti
Arvesti, mida nĂ€ete vĂ€ljastuses XPENDING â on iga sĂ”numi kohaletoimetamiste arv. Selline arvesti suureneb kahel viisil: kui sĂ”num on edukalt nĂ”utud lĂ€bi XCLAIM vĂ”i kui kasutatakse kĂ”net XREADGROUP.
See, et mĂ”ned sĂ”numid saadetakse mitu korda, on normaalne. Peamine on see, et kĂ”ik sĂ”numid oleksid lĂ”puks töödeldud. MĂ”nikord vĂ”ivad sĂ”numite töötlemise kĂ€igus ilmneda probleemid, kas sĂ”numi enda rikke tĂ”ttu vĂ”i töötleja koodis esineva vea tĂ”ttu. Sellisel juhul vĂ”ib juhtuda, et seda sĂ”numit ei suudeta töötleda. Kuna meil on saatmisproovide arvuti, saame seda arvestit kasutada selliste olukordade tuvastamiseks. SeetĂ”ttu, kui saatmisproovide arv ulatub teie seatud suure arvuni, on mĂ”istlik viia selline sĂ”num teise voogu ja saata sĂŒsteemiadministraatorile teade.
Voogude seisund
Meeskond XINFO kasutatakse voogude ja nende gruppide erineva teabe pÀrimiseks. NÀiteks kÀsk nÀeb selline 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) "message"
2) "banana"
Ălalolev kĂ€sk nĂ€itab antud voogude ĂŒldteavet. JĂ€rgmine on 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
Ălalolev kĂ€sk nĂ€itab ĂŒldteavet kĂ”igi antud voogude gruppide kohta.
> XINFO CONSUMERS mystream mygroup
1) 1) nimi
2) "Alice"
3) ootel
4) (tÀisarv) 1
5) tĂŒhi
6) (tÀisarv) 9104628
2) 1) nimi
2) "Bob"
3) ootel
4) (tÀisarv) 1
5) tĂŒhi
6) (tÀisarv) 83841983
Ălalolev kĂ€sk nĂ€itab teavet kĂ”igi antud voo ja grupi tellijate kohta.
Kui unustate kĂ€su sĂŒntaksi, pöörduge lihtsalt kĂ€su enda poole abi saamiseks:
> XINFO HELP
1) XINFO {alamkÀsk} arg arg ... arg. AlamkÀskude hulka kuuluvad:
2) CONSUMERS {vÔti} {grupinimi} -- NÀita grupi {grupinimi} tarbijagrupe.
3) GROUPS {vÔti} -- NÀita voogi tarbijagruppe.
4) STREAM {vÔti} -- NÀita teavet voo kohta.
5) HELP -- Prindi see abi.
Voo suuruse piirang
Paljud rakendused ei soovi andmeid pidevalt voogu koguda. Sageli on kasulik, kui voos on maksimaalne lubatud sĂ”numite arv. Muudel juhtudel on mĂ”istlik viia kĂ”ik sĂ”numid voost teisele pĂŒsivale salvestusse, kui voog on saavutanud mÀÀratud suuruse. Voo suurust saab piirata MAXLEN parameetri kaudu kĂ€sus. 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
(integer) 2
> XRANGE mystream - +
1) 1) 1526654999635-0
2) 1) "value"
2) "2"
2) 1) 1526655000369-0
2) 1) "value"
2) "3"
MAXLEN kasutamisel kustutatakse vanad kirjed automaatselt, kui jÔutakse ettenÀhtud pikkusele, nii et voog on pideva suurusega. Siiski ei toimu sellisel juhul trimmimine Redis'i mÀlu kÔige tÔhusamal viisil. Olukorda saab parandada jÀrgmiste meetoditega:
XADD mystream MAXLEN ~ 1000 * ... sisestusvÀljad siia ...
Argument ~ ĂŒlaltoodud nĂ€ites tĂ€hendab, et me ei pea voolu pikkust piirama konkreetse vÀÀrtusega. Meie nĂ€ites vĂ”ib see olla mis tahes number, mis on suurem vĂ”i vĂ”rdne 1000 (nt 1000, 1010 vĂ”i 1030). Lihtsalt oleme selgelt öelnud, et soovime, et meie voog sĂ€ilitaks vĂ€hemalt 1000 kirjet. See muudab mĂ€lu kasutamise palju efektiivsemaks Redis'is.
Samuti on olemas eraldi kÀsk XTRIM, mis teeb sama:
> XTRIM mystream MAXLEN 10
> XTRIM mystream MAXLEN ~ 10
PĂŒsiv sĂ€ilitamine ja replikatsioon
Redis Stream replitseerib asĂŒnkroonselt slave nootidesse ja salvestab failidesse AOF (kĂ”igi andmete snapshot) ja RDB (kĂ”igi kirjutamistehingute logi). Samuti toetatakse Consumer Groups oleku replikatsiooni. SeetĂ”ttu, kui sĂ”num on master noodi peal 'pending' olekus, siis slave nootides on selle sĂ”numi olek sama.
Eri elementide eemaldamine voost
SÔnumite eemaldamiseks on olemas eriline kÀsk XDEL. KÀsk saab voogude nime, millele jÀrgneb sÔnumite identifikaatorid, mida 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"
Selle kÀsu kasutamise juures tuleb arvesse vÔtta, et mÀlu vabastamine ei toimu kohe.
Nullpikkusega vood
Vood ja teised Redis andmestruktuurid erinevad sellest, et kui teised andmestruktuurid ei sisalda enam elemente, siis kustutatakse andmestruktuur mĂ€lust. NĂ€iteks, sorteeritud hulk kustutatakse tĂ€ielikult, kui ZREM kutsub vĂ€lja viimane element. Vastupidiselt on voogudel lubatud jÀÀda mĂ€llu, isegi kui neil pole ĂŒhtegi elementi.
KokkuvÔte
Redis Stream sobib suurepĂ€raselt sĂ”numite vahendamiseks, sĂ”numijadikute, ĂŒhtse logi ja vestlussĂŒsteemide loomiseks, mis salvestavad ajalugu.
Nagu kord ĂŒtles , programmid on algoritmid pluss andmestruktuurid, ning Redis pakub juba mĂ”lemat.
Allikas: habr.com
