Redis ZSCAN

Redis Zscan



Iteracija čez člane razvrščenega niza

Kot vsi veste, so razvrščeni nizi Redis izpeljani iz običajnih nizov, kjer je vsak član razvrščen glede na vrednost rezultata v naraščajočem vrstnem redu. Če imata dva ali več članov enako vrednost točk, so razvrščeni po leksikografskem vrstnem redu. Običajno lahko člane in rezultate neposredno pridobite z ukazom ZRANGE. Ko imate velik razvrščen niz s tisoči članov, lahko ukaz ZRANGE blokira strežnik za dolgo časa, kot ukaza SMEMBERS in KEYS, kar je pomanjkljivost. Redis torej ponuja poseben ukaz, imenovan ZSCAN, ki je izpeljan iz ukaza SCAN za ponavljanje članov razvrščenega niza. Ker ukaz ZSCAN podeduje ukaz SCAN, so skoraj vsa vedenja enaka splošnemu ukazu SCAN.







Kot na dani sliki je ukaz SCAN iterator, ki temelji na kazalcu. Zato je potrebna ena ali več iteracij, da se zagotovijo vsi elementi zbirke Redis. Ker ukaz ZSCAN podeduje nadrejeni ukaz SCAN, je vedenje enako. V tem priročniku bodo podrobno obravnavani sintaksa in primeri uporabe ukaza ZSCAN.



Ukaz ZSCAN

Ukaz ZSCAN je iterator na osnovi kazalca, ki začne iteracijo z 0. kazalcem. Nato v vsaki ponovitvi vrne nič ali več razvrščenih članov niza skupaj z naslednjim kazalcem, ki naj se uporabi kot kazalec za naslednji klic ukaza. Če je vrnjeni kazalec 0 po eni ali več ponovitvah, to pomeni, da je postopek skeniranja končan. Na tej točki so vrnjeni vsi razvrščeni člani niza. Ta postopek se imenuje polna ponovitev. Kot lahko vidite, ukaz ZSCAN ohranja svoje stanje samo z uporabo kazalca, kar vodi do omejenega poznavanja stanja. Zato so z ukazom ZSCAN povezane naslednje pomanjkljivosti.



  • Isti element se lahko vrne v več ponovitvah.
  • Če član ni prisoten na začetku postopka skeniranja, obstaja verjetnost, da se član ne bo vrnil med celotno iteracijo.

Poleg tega ni jamstva glede števila vrnjenih članov. V nekaterih primerih, če je razvrščeni niz zelo majhen, so lahko vsi člani vrnjeni že v prvi ponovitvi. Ker Redis uporablja posebno obliko kodiranja, pakiranega z eno dodelitvijo, da zadrži člane, dokler ni doseženo največje število elementov. Ukaz ZSCAN lahko vrne kazalec le, če je skenirana podatkovna struktura predstavljena kot zgoščena tabela.





Sintaksa:
Ukaz ZSCAN uporablja skoraj enako sintakso kot ukaz SCAN, le da kot prvi argument sprejme razvrščeni ključ. Sintaksa ukaza z dovoljenimi argumenti je naslednja:

Kazalec sorted_set_key ZSCAN [ MATCH vzorec ] [ COUNT member_count ]

sorted_set_key : Ključ razvrščenega niza.
Kazalec : vrednost kazalca se začne pri 0 in konča pri 0, če gre za celotno ponovitev.



Naslednji argumenti niso obvezni:

TEKMA : vzorec za ujemanje pri pridobivanju elementov v vsaki ponovitvi. Vrnejo se samo ujemajoči se člani.
ŠTEJTE : Približno število članov, ki jih je treba vrniti v vsaki ponovitvi.

Vrnjeni niz rezultatov na iteracijo vsebuje nekaj elementov. Prvi del je 64-bitno nepredznačeno celo število, ki predstavlja kazalec, ki bo posredovan naslednjemu klicu. Naslednji del je niz članov in povezanih rezultatov.

Primer uporabe 1 – Pridobite vse člane in njihove opravljene misije spletne igre

Predpostavimo, da podjetje za spletne igre vzdržuje lestvico najboljših z uporabo razvrščenega nabora Redis. Ker ogromno uporabnikov aktivno igra igro, potrebujejo način za pridobitev vsakega igralca in njegovega povezanega rezultata, ki je število opravljenih misij. Priklic je treba izvesti brez blokiranja strežnika. Zato priporočamo uporabo ukaza ZSCAN na naslednji način:

Najprej ustvarimo razvrščen niz z nekaterimi igralci in opravljenim številom misij.

zadd LeaderBoard 12 Igralec6: Janez 4 Igralec2: Mary 22 Igralec1: Patel petnajst Igralec: enajst 23 Igralec 5: Ann 30 Igralec 7: Ostro 23 Igralec12:abby dva Igralec 13: Nicky 6 Igralec 9: Jeremy 7 Igralec45: Kina

Zdaj lahko ponovimo člane razvrščenega niza na naslednji način:

zscan Lestvica najboljših 0

Izhod:

Vrednost kurzorja je 0 v vrnjenem nizu rezultatov, kar pomeni, da so vsi člani vrnjeni na koncu prve ponovitve. V tem primeru, ker je število članov majhno, Redis predstavlja te člane z uporabo pakiranega kodiranja z eno dodelitvijo. Zato ukaz vrne vse člane v razvrščenem nizu, dokler ni dosežena največja velikost paketa ali število članov. To se imenuje polna ponovitev. Ker na koncu prve ponovitve prejmemo vseh deset članov in njihove ocene. Če imamo na stotine članov, je to v pomnilniku predstavljeno kot zgoščena tabela. Torej je potrebnih več iteracij, da se vrnejo vsi člani.

Parameter COUNT lahko uporabite za omejitev števila članov, vrnjenih v ponovitvi. Privzeto je ta argument nastavljen na 10. Če je razvrščeni niz sestavljen iz več sto članov, ga v pomnilniku predstavlja zgoščevalna tabela. Torej je število vrnjenih članov okoli deset na ponovitev. Vrednost argumenta COUNT je prezrta, če je razvrščeni niz premajhen.

Primer uporabe 2 – Pridobite igralce, katerih ime se začne s črko 'J'

Ukaz ZSCAN lahko uporabite za filtriranje vrnjenih članov na podlagi ujemanja vzorca. V tem primeru je treba podati argument MATCH.

Uporabimo isti primer iz prejšnjega primera uporabe. Zahteva je pridobiti igralce, katerih ime se začne s črko 'J'. Gre samo za implementacijo naslednje kul funkcije, povezane z igro. Argument MATCH lahko podate na naslednji način:

zscan Lestvica najboljših 0 tekma * J *

To bi v idealnem primeru moralo vrniti dva člana z imenom Jeremy in John.

Zaključek

Če povzamemo, se ukaz ZSCAN uporablja za ponavljanje članov in rezultatov razvrščenega niza Redis. Ta ukaz se obnaša enako kot ukaz SCAN, le da ukaz ZSCAN sprejme nastavljeni ključ kot prvi argument. Kot je razloženo v primerih uporabe, lahko ukaz ZSCAN uporabite na različne načine, tako da podate argumenta MATCH in COUNT, kjer lahko pridobite člane in povezane rezultate, ki se ujemajo z določenim vzorcem, in omejite vrnjeno število članov na ponovitev. Na splošno je lahko ukaz ZSCAN uporaben pri pridobivanju članov razvrščenega niza brez blokiranja strežnika ali odjemalca.