Redis ZSCAN

Redis Zscan



Iterați peste membrii unui set sortat

După cum știți cu toții, seturile sortate Redis sunt derivate din seturile obișnuite în care fiecare membru este ordonat după valoarea sa de scor în ordine crescătoare. Dacă doi sau mai mulți membri dețin aceeași valoare a punctajului, aceștia sunt ordonați în ordine lexicografică. De obicei, membrii și scorurile pot fi preluate direct folosind comanda ZRANGE. Când aveți un set mare sortat cu mii de membri, comanda ZRANGE poate bloca serverul pentru o lungă perioadă de timp, cum ar fi comenzile SMEMBERS și KEYS, ceea ce este un dezavantaj. Așadar, Redis oferă o comandă specială numită ZSCAN care este derivată din comanda SCAN pentru a repeta peste membrii unui set sortat. Deoarece comanda ZSCAN moștenește de la comanda SCAN, aproape toate comportamentele sunt aceleași cu comanda SCAN de uz general.







Ca și în figura dată, comanda SCAN este un iterator bazat pe cursor. Prin urmare, este nevoie de una sau mai multe iterații pentru a furniza toate elementele unei colecții Redis. Deoarece comanda ZSCAN moștenește de la comanda părinte SCAN, comportamentul este același. În acest ghid, sintaxa și cazurile de utilizare ale comenzii ZSCAN vor fi discutate în detaliu.



Comanda ZSCAN

Comanda ZSCAN este un iterator bazat pe cursor care începe iterația cu al 0-lea cursor. Ulterior, în fiecare iterație, returnează zero sau mai mulți membri set sortați împreună cu următorul cursor care ar trebui să fie folosit ca cursor pentru următorul apel de comandă. Dacă cursorul returnat este 0 după una sau mai multe iterații, înseamnă că procesul de scanare s-a încheiat. Toți membrii setului sortați sunt returnați în acest moment. Acest proces se numește o iterație completă. După cum puteți vedea, comanda ZSCAN își păstrează starea doar folosind un cursor, ceea ce duce la o conștientizare limitată a stării. Prin urmare, următoarele dezavantaje sunt asociate cu comanda ZSCAN.



  • Același element poate reveni în mai multe iterații.
  • Dacă un membru nu este prezent la începutul procesului de scanare, există probabilitatea de a nu returna acel membru în timpul unei iterații complete.

În plus, nu există nicio garanție cu privire la numărul de membri returnați. În unele cazuri, dacă setul sortat este foarte mic, toți membrii pot fi returnați chiar în prima iterație. Deoarece Redis folosește un format special de codificare cu alocare unică pentru a păstra membrii până când este atins un număr maxim de articole. Comanda ZSCAN este capabilă să returneze un cursor numai dacă structura datelor scanate este reprezentată ca un tabel hash.





Sintaxă:
Comanda ZSCAN folosește aproape aceeași sintaxă ca și comanda SCAN, cu excepția faptului că acceptă o cheie de set sortată ca prim argument. Sintaxa comenzii cu argumentele permise este următoarea:

Cursor ZSCAN sorted_set_key [ Model MATCH ] [ COUNT membri_număr ]

sorted_set_key : Cheia setului sortat.
Cursor : Valoarea cursorului începe de la 0 și se termină la 0 dacă este o iterație completă.



Următoarele argumente sunt opționale:

MECI : Un model care să se potrivească la preluarea elementelor din fiecare iterație. Doar membrii potriviți sunt returnați.
NUMARA : numărul aproximativ de membri care vor fi returnați în fiecare iterație.

Setul de rezultate returnat per iterație conține câteva elemente. Prima parte este un întreg fără semn pe 64 de biți care reprezintă cursorul care urmează să fie trecut în apelul următor. Următoarea parte este o serie de membri și scoruri asociate.

Cazul de utilizare 1 – Preluați toți membrii și misiunile lor finalizate ale unui joc online

Să presupunem că o companie de jocuri online menține un clasament folosind setul sortat Redis. Deoarece utilizatorii masivi joacă în mod activ, au nevoie de o modalitate de a recupera fiecare jucător și scorul asociat, care este numărul de misiuni finalizate. Este obligatoriu să efectuați recuperarea fără a bloca serverul. Deci, recomandarea este să utilizați comanda ZSCAN după cum urmează:

În primul rând, creăm un set sortat cu câțiva jucători și numărul completat de misiuni.

zadd Leaderboard 12 Jucătorul 6: John 4 Jucătoarea 2: Mary 22 Jucătorul 1: Patel cincisprezece Jucător: unsprezece 23 Jucătoarea 5:Ann 30 Jucătorul 7: Aspru 23 Player12:abby Două Jucătorul 13: Nicky 6 Jucătorul 9: Jeremy 7 Jucătorul 45: Kina

Acum, putem itera peste membrii setului sortat după cum urmează:

zscan Leaderboard 0

Ieșire:

Valoarea cursorului este 0 în setul de rezultate returnate, ceea ce înseamnă că toți membrii sunt returnați la sfârșitul primei iterații. În acest caz, deoarece numărul de membri este mic, Redis reprezintă acești membri utilizând o codificare cu o singură alocare. Prin urmare, până când se atinge o dimensiune maximă a pachetului sau un număr de membri, comanda returnează toți membrii din setul sortat. Aceasta se numește o iterație completă. Pentru că la sfârșitul primei iterații îi primim pe toți cei zece membri și scorurile acestora. Dacă avem sute de membri, acesta este reprezentat ca un tabel hash în memorie. Deci, este nevoie de mai multe iterații pentru a returna toți membrii.

Parametrul COUNT poate fi utilizat pentru a limita numărul de membri returnați într-o iterație. În mod implicit, acest argument este setat la 10. Dacă setul sortat este format din sute de membri, acesta este reprezentat de un tabel hash în memorie. Deci, numărul de membri returnați este de aproximativ zece pe iterație. Valoarea argumentului COUNT este ignorată dacă setul sortat este prea mic.

Cazul de utilizare 2 – Preluați jucătorii al căror nume începe cu litera „J”

Comanda ZSCAN poate fi folosită pentru a filtra membrii returnați pe baza unei potriviri de model. În acest caz, trebuie specificat argumentul MATCH.

Să folosim același exemplu din cazul de utilizare anterior. Cerința este să aduceți jucătorii al căror nume începe cu litera „J”. Este doar pentru a implementa următoarea caracteristică cool legată de joc. Argumentul MATCH poate fi specificat după cum urmează:

zscan Leaderboard 0 Meci * J *

În mod ideal, ar trebui să returneze doi membri ale căror nume sunt Jeremy și John.

Concluzie

În rezumat, comanda ZSCAN este folosită pentru a repeta membrii și scorurile unui set sortat Redis. Această comandă se comportă la fel ca comanda SCAN, cu excepția faptului că comanda ZSCAN acceptă cheia set ca prim argument. După cum s-a discutat în cazurile de utilizare, comanda ZSCAN poate fi utilizată în moduri diferite prin specificarea argumentelor MATCH și COUNT de unde puteți prelua membrii și scorurile asociate care se potrivesc cu un anumit model și limitați numărul de membri returnați per iterație. În general, comanda ZSCAN poate fi utilă atunci când se regăsesc membrii unui set sortat fără a bloca serverul sau clientul.