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

  1. 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.
  2. 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).
  3. 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:

  1. Iga sÔnum toimetatakse erinevatele tellijatele grupi sees.
  2. 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.
  3. 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.
  4. 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”.
  5. 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 Niklaus Wirth, programmid on algoritmid pluss andmestruktuurid, ning Redis pakub juba mĂ”lemat.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster