Redis ZSCAN

Redis Zscan



Iterujte cez členov zoradeného súboru

Ako všetci viete, Redis triedené sady sú odvodené od bežných sád, kde je každý člen zoradený podľa hodnoty skóre vo vzostupnom poradí. Ak majú dva alebo viac členov rovnakú hodnotu skóre, sú zoradené podľa lexikografického poradia. Zvyčajne sa členovia a skóre dajú priamo získať pomocou príkazu ZRANGE. Keď máte veľkú triedenú množinu s tisíckami členov, príkaz ZRANGE môže blokovať server na dlhú dobu ako príkazy SMEMBERS a KEYS, čo je nevýhoda. Redis teda ponúka špeciálny príkaz s názvom ZSCAN, ktorý je odvodený od príkazu SCAN na iteráciu členov zoradeného súboru. Keďže príkaz ZSCAN dedí z príkazu SCAN, takmer všetky spôsoby správania sú rovnaké ako pri príkaze SCAN na všeobecné použitie.







Rovnako ako na obrázku, príkaz SCAN je kurzorový iterátor. Na poskytnutie všetkých položiek kolekcie Redis je teda potrebná jedna alebo viac iterácií. Keďže príkaz ZSCAN dedí z nadradeného príkazu SCAN, správanie je rovnaké. V tejto príručke sa podrobne rozoberie syntax a prípady použitia príkazu ZSCAN.



Príkaz ZSCAN

Príkaz ZSCAN je kurzorový iterátor, ktorý začína iteráciu s 0-tým kurzorom. Potom v každej iterácii vráti nula alebo viac zoradených členov množiny spolu s ďalším kurzorom, ktorý by sa mal použiť ako kurzor pre nasledujúce volanie príkazu. Ak je vrátený kurzor po jednej alebo viacerých iteráciách 0, znamená to, že proces skenovania sa skončil. V tomto bode sa vrátia všetky zoradené členy množiny. Tento proces sa nazýva úplná iterácia. Ako ste mohli vidieť, príkaz ZSCAN udržiava svoj stav iba pomocou kurzora, čo vedie k obmedzenému informovaniu o stave. Preto sú s príkazom ZSCAN spojené nasledujúce nevýhody.



  • Ten istý prvok sa môže vrátiť vo viacerých iteráciách.
  • Ak člen nie je prítomný na začiatku procesu skenovania, existuje pravdepodobnosť, že sa tento člen počas celej iterácie nevráti.

Okrem toho neexistuje žiadna záruka na počet vrátených členov. V niektorých prípadoch, ak je triedená množina veľmi malá, môžu byť všetky členy vrátené v úplne prvej iterácii. Pretože Redis používa špeciálny formát kódovania s jednou alokáciou na zadržanie členov, kým sa nedosiahne maximálny počet položiek. Príkaz ZSCAN je schopný vrátiť kurzor iba vtedy, ak je naskenovaná dátová štruktúra reprezentovaná ako tabuľka hash.





Syntax:
Príkaz ZSCAN používa takmer rovnakú syntax ako príkaz SCAN okrem toho, že ako prvý argument akceptuje triedený kľúč množiny. Syntax príkazu s povolenými argumentmi je nasledovná:

Kurzor ZSCAN sort_set_key [ MATCH vzor ] [ Počet členov: COUNT ]

sort_set_key : Kľúč zoradeného súboru.
Kurzor : Hodnota kurzora začína od 0 a končí na 0, ak ide o úplnú iteráciu.



Nasledujúce argumenty sú voliteľné:

ZÁPAS : Vzor, ktorý sa má zhodovať pri získavaní prvkov v každej iterácii. Vrátia sa len spárovaní členovia.
COUNT : Približný počet členov, ktorí sa majú vrátiť v každej iterácii.

Vrátená sada výsledkov na iteráciu obsahuje niekoľko prvkov. Prvá časť je 64-bitové celé číslo bez znamienka, ktoré predstavuje kurzor, ktorý sa má odovzdať do ďalšieho volania. Ďalšou časťou je pole členov a súvisiace skóre.

Prípad použitia 1 – Získajte všetkých členov a ich splnené misie online hry

Predpokladajme, že spoločnosť zaoberajúca sa online hrami udržiava rebríček pomocou triedeného súboru Redis. Keďže hru aktívne hrajú masívni používatelia, potrebujú spôsob, ako získať každého hráča a súvisiace skóre, ktorým je počet dokončených misií. Je nevyhnutné vykonať načítanie bez zablokovania servera. Odporúča sa teda použiť príkaz ZSCAN nasledovne:

Najprv si vytvoríme zoradený set s niektorými hráčmi a splneným počtom misií.

zadd Leaderboard 12 Hráč 6: John 4 Hráč 2: Mary 22 Hráč 1: Patel pätnásť hráč: jedenásť 23 Hráč 5:Ann 30 Hráč 7: Drsné 23 Hráč 12: Abby dva Hráč 13: Nicky 6 Hráč 9: Jeremy 7 Hráč 45: Čína

Teraz môžeme iterovať cez členov zoradeného súboru takto:

zscan Leaderboard 0

Výkon:

Hodnota kurzora je 0 vo vrátenej sade výsledkov, čo znamená, že všetky členy sú vrátené na konci prvej iterácie. V tomto prípade, pretože počet členov je malý, Redis zastupuje týchto členov pomocou jednopriestorového kódovania. Preto, kým sa nedosiahne maximálna veľkosť balíka alebo počet členov, príkaz vráti všetkých členov v zoradenej množine. Toto sa nazýva úplná iterácia. Pretože na konci prvej iterácie dostaneme všetkých desať členov a ich skóre. Ak máme stovky členov, je reprezentovaný ako hašovacia tabuľka v pamäti. Takže návrat všetkých členov trvá niekoľko iterácií.

Parameter COUNT možno použiť na obmedzenie počtu členov vrátených v iterácii. Štandardne je tento argument nastavený na 10. Ak triedená množina pozostáva zo stoviek členov, je reprezentovaná hash tabuľkou v pamäti. Počet vrátených členov je teda okolo desiatich na iteráciu. Hodnota argumentu COUNT sa ignoruje, ak je triedená množina príliš malá.

Prípad použitia 2 – Vyzvite hráčov, ktorých meno sa začína na písmeno „J“

Príkaz ZSCAN možno použiť na odfiltrovanie vrátených členov na základe zhody vzoru. V takom prípade musí byť špecifikovaný argument MATCH.

Použime rovnaký príklad z predchádzajúceho prípadu použitia. Požiadavkou je priviesť hráčov, ktorých meno začína písmenom „J“. Ide len o implementáciu ďalšej skvelej funkcie súvisiacej s hrou. Argument MATCH možno zadať takto:

zscan Leaderboard 0 zápas * J *

V ideálnom prípade by sa mali vrátiť dvaja členovia, ktorých mená sú Jeremy a John.

Záver

Stručne povedané, príkaz ZSCAN sa používa na iteráciu členov a skóre zoradeného súboru Redis. Tento príkaz sa správa rovnako ako príkaz SCAN okrem toho, že príkaz ZSCAN akceptuje kľúč set ako prvý argument. Ako je uvedené v prípadoch použitia, príkaz ZSCAN možno použiť rôznymi spôsobmi zadaním argumentov MATCH a COUNT, kde môžete získať členov a súvisiace skóre, ktoré zodpovedajú špecifickému vzoru a obmedziť počet vrátených členov na iteráciu. Celkovo môže byť príkaz ZSCAN užitočný pri získavaní členov zoradeného súboru bez blokovania servera alebo klienta.