Redis ZSCAN

Redis Zscan



Iterujte přes členy seřazené sady

Jak všichni víte, seřazené sady Redis jsou odvozeny od běžných sad, kde je každý člen seřazen vzestupně podle hodnoty skóre. Pokud mají dva nebo více členů stejnou hodnotu skóre, jsou seřazeny podle lexikografického pořadí. Obvykle lze členy a skóre přímo načíst pomocí příkazu ZRANGE. Když máte velkou seřazenou sadu s tisíci členy, příkaz ZRANGE může blokovat server na dlouhou dobu jako příkazy SMEMBERS a KEYS, což je nevýhoda. Redis tedy nabízí speciální příkaz nazvaný ZSCAN, který je odvozen od příkazu SCAN pro iteraci přes členy setříděné sady. Protože příkaz ZSCAN dědí z příkazu SCAN, téměř všechna chování jsou stejná jako u příkazu SCAN pro obecné účely.







Stejně jako na uvedeném obrázku je příkaz SCAN iterátor založený na kurzoru. Poskytnutí všech položek kolekce Redis tedy vyžaduje jednu nebo více iterací. Protože příkaz ZSCAN dědí z nadřazeného příkazu SCAN, chování je stejné. V této příručce budou podrobně popsány syntaxe a případy použití příkazu ZSCAN.



Příkaz ZSCAN

Příkaz ZSCAN je kurzorový iterátor, který spouští iteraci s nulovým kurzorem. Poté v každé iteraci vrátí nula nebo více seřazených členů sady spolu s dalším kurzorem, který by měl být použit jako kurzor pro následující volání příkazu. Pokud je vrácený kurzor po jedné nebo více iteracích 0, znamená to, že proces skenování skončil. V tomto okamžiku se vrátí všechny seřazené členy sady. Tento proces se nazývá úplná iterace. Jak jste mohli vidět, příkaz ZSCAN udržuje svůj stav pouze pomocí kurzoru, což vede k omezenému povědomí o stavu. Proto jsou s příkazem ZSCAN spojeny následující nevýhody.



  • Stejný prvek se může vrátit ve více iteracích.
  • Pokud člen není přítomen na začátku procesu skenování, existuje pravděpodobnost, že se během úplné iterace nevrátí.

Navíc neexistuje žádná záruka na počet vrácených členů. V některých případech, pokud je setříděná sada velmi malá, mohou být všichni členové vráceni hned v první iteraci. Protože Redis používá speciální formát kódování s jednou alokací, který drží členy, dokud není dosaženo maximálního počtu položek. Příkaz ZSCAN je schopen vrátit kurzor pouze v případě, že je naskenovaná datová struktura reprezentována jako hashovací tabulka.





Syntax:
Příkaz ZSCAN používá téměř stejnou syntaxi jako příkaz SCAN kromě toho, že jako první argument přijímá seřazený klíč set. Syntaxe příkazu s povolenými argumenty je následující:

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

sorted_set_key : Klíč seřazené sady.
Kurzor : Hodnota kurzoru začíná od 0 a končí na 0, pokud se jedná o úplnou iteraci.



Následující argumenty jsou volitelné:

ZÁPAS : Vzor, který se má shodovat při načítání prvků v každé iteraci. Vrátí se pouze spárovaní členové.
POČET : Přibližný počet členů, kteří mají být vráceni v každé iteraci.

Vrácená sada výsledků na iteraci obsahuje několik prvků. První část je 64bitové celé číslo bez znaménka, které představuje kurzor, který má být předán do dalšího volání. Další částí je pole členů a související partitury.

Případ použití 1 – Získejte všechny členy a jejich dokončené mise online hry

Předpokládejme, že online herní společnost udržuje žebříček pomocí seřazené sady Redis. Vzhledem k tomu, že hru aktivně hrají masivní uživatelé, potřebují způsob, jak získat každého hráče a jeho související skóre, což je počet dokončených misí. Je nutné provést načítání bez blokování serveru. Doporučuje se tedy použít příkaz ZSCAN následovně:

Nejprve vytvoříme seřazenou sadu s některými hráči a splněným počtem misí.

zadd žebříček 12 Hráč 6: John 4 Hráč 2: Mary 22 Hráč 1: Patel patnáct Hráč: jedenáct 23 Hráč 5:Ann 30 Hráč 7: Drsné 23 Hráč 12: Abby dva Hráč 13: Nicky 6 Hráč 9: Jeremy 7 Player45:Kina

Nyní můžeme iterovat členy seřazené sady následovně:

zscan LeaderBoard 0

Výstup:

Hodnota kurzoru je ve vrácené sadě výsledků 0, což znamená, že všechny členy jsou vráceny na konci první iterace. V tomto případě, protože počet členů je malý, Redis zastupuje tyto členy pomocí sbaleného kódování s jedním přidělením. Proto dokud není dosaženo maximální velikosti balíčku nebo počtu členů, příkaz vrací všechny členy v seřazené sadě. Tomu se říká úplná iterace. Protože na konci první iterace obdržíme všech deset členů a jejich skóre. Pokud máme stovky členů, je to reprezentováno jako hash tabulka v paměti. Takže návrat všech členů trvá několik iterací.

Parametr COUNT lze použít k omezení počtu členů vrácených v iteraci. Standardně je tento argument nastaven na 10. Pokud setříděná sada obsahuje stovky členů, je reprezentována hashovací tabulkou v paměti. Počet vrácených členů je tedy kolem deseti na iteraci. Hodnota argumentu COUNT je ignorována, pokud je seřazená sada příliš malá.

Případ použití 2 – Vyzvedněte hráče, jejichž jméno začíná písmenem „J“

Příkaz ZSCAN lze použít k odfiltrování vrácených členů na základě shody vzoru. V takovém případě musí být zadán argument MATCH.

Použijme stejný příklad z předchozího případu použití. Požadavkem je přivést hráče, jejichž jméno začíná písmenem „J“. Jde jen o implementaci další skvělé funkce související s hrou. Argument MATCH lze zadat takto:

zscan LeaderBoard 0 zápas * J *

To by mělo v ideálním případě vrátit dva členy, kteří se jmenují Jeremy a John.

Závěr

Stručně řečeno, příkaz ZSCAN se používá k iteraci přes členy a skóre seřazené sady Redis. Tento příkaz se chová stejně jako příkaz SCAN s tím rozdílem, že příkaz ZSCAN přijímá klíč set jako první argument. Jak je uvedeno v případech použití, příkaz ZSCAN lze použít různými způsoby zadáním argumentů MATCH a COUNT, kde můžete načíst členy a přidružená skóre, která odpovídají konkrétnímu vzoru, a omezit počet vrácených členů na iteraci. Celkově může být příkaz ZSCAN užitečný při načítání členů setříděné sady bez blokování serveru nebo klienta.