Redis ZSCAN

Redis Zscan



Iterare sui membri di un set ordinato

Come tutti sapete, gli insiemi ordinati Redis derivano dagli insiemi regolari in cui ogni membro è ordinato in base al valore del punteggio in ordine crescente. Se due o più membri hanno lo stesso punteggio, vengono ordinati in base all'ordine lessicografico. Di solito, i membri e i punteggi possono essere recuperati direttamente utilizzando il comando ZRANGE. Quando hai un grande set ordinato con migliaia di membri, il comando ZRANGE potrebbe bloccare il server per molto tempo come i comandi SMEMBERS e KEYS, il che è uno svantaggio. Quindi, Redis offre un comando speciale chiamato ZSCAN che deriva dal comando SCAN per scorrere i membri di un set ordinato. Poiché il comando ZSCAN eredita dal comando SCAN, quasi tutti i comportamenti sono gli stessi del comando SCAN generico.







Come nella figura data, il comando SCAN è un iteratore basato sul cursore. Pertanto, sono necessarie una o più iterazioni per fornire tutti gli elementi di una raccolta Redis. Poiché il comando ZSCAN eredita dal comando SCAN padre, il comportamento è lo stesso. In questa guida verranno discussi in dettaglio la sintassi e i casi d'uso del comando ZSCAN.



Il comando ZSCAN

Il comando ZSCAN è un iteratore basato sul cursore che avvia l'iterazione con il cursore 0. Successivamente, in ogni iterazione, restituisce zero o più membri dell'insieme ordinati insieme al cursore successivo che dovrebbe essere utilizzato come cursore per la successiva chiamata al comando. Se il cursore restituito è 0 dopo una o più iterazioni, significa che il processo di scansione è terminato. Tutti i membri del set ordinato vengono restituiti a questo punto. Questo processo è chiamato iterazione completa. Come puoi vedere, il comando ZSCAN mantiene il suo stato solo utilizzando un cursore che porta a una consapevolezza dello stato limitata. Pertanto, i seguenti inconvenienti sono associati al comando ZSCAN.



  • Lo stesso elemento può tornare in più iterazioni.
  • Se un membro non è presente all'inizio del processo di scansione, è probabile che non restituisca quel membro durante un'iterazione completa.

Inoltre, non vi è alcuna garanzia sul conteggio dei membri restituiti. In alcuni casi, se l'insieme ordinato è molto piccolo, tutti i membri potrebbero essere restituiti nella prima iterazione. Perché Redis utilizza uno speciale formato di codifica imballato con allocazione singola per trattenere i membri fino al raggiungimento del numero massimo di articoli. Il comando ZSCAN è in grado di restituire un cursore solo se la struttura dei dati scansionata è rappresentata come una tabella hash.





Sintassi:
Il comando ZSCAN utilizza quasi la stessa sintassi del comando SCAN tranne per il fatto che accetta una chiave set ordinata come primo argomento. La sintassi del comando con gli argomenti consentiti è la seguente:

Cursore di chiavi_impostate_ordinate ZSCAN [ Modello ABBINAMENTO ] [ COUNT numero_membri ]

chiave_insieme_ordinata : La chiave del set ordinato.
Cursore : Il valore del cursore inizia da 0 e termina a 0 se si tratta di un'iterazione completa.



I seguenti argomenti sono facoltativi:

INCONTRO : un modello da abbinare quando si recuperano gli elementi in ogni iterazione. Vengono restituiti solo i membri corrispondenti.
CONTARE : il numero approssimativo di membri da restituire in ogni iterazione.

Il set di risultati restituito per iterazione contiene un paio di elementi. La prima parte è un intero senza segno a 64 bit che rappresenta il cursore da passare alla chiamata successiva. La parte successiva è una serie di membri e punteggi associati.

Caso d'uso 1: recuperare tutti i membri e le loro missioni completate di un gioco online

Supponiamo che una società di giochi online mantenga una classifica utilizzando il set ordinato Redis. Poiché gli utenti enormi stanno giocando attivamente, hanno bisogno di un modo per recuperare ogni giocatore e il punteggio associato che è il numero di missioni completate. È necessario eseguire il recupero senza bloccare il server. Quindi, la raccomandazione è di utilizzare il comando ZSCAN come segue:

Innanzitutto, creiamo un set ordinato con alcuni giocatori e il numero di missioni completate.

Zadd LeaderBoard 12 Giocatore 6: Giovanni 4 Giocatore 2: Maria 22 Giocatore 1: Patel quindici Giocatore: undici 23 Giocatore 5: Anna 30 Giocatore 7: Duro 23 Giocatore 12: abby Due Giocatore 13: Nicky 6 Giocatore 9: Jeremy 7 Giocatore 45: Kinna

Ora possiamo scorrere i membri dell'insieme ordinato come segue:

Classifica zscan 0

Produzione:

Il valore del cursore è 0 nel set di risultati restituito, il che significa che tutti i membri vengono restituiti alla fine della prima iterazione. In questo caso, poiché il numero di membri è ridotto, Redis rappresenta questi membri utilizzando una codifica compressa con allocazione singola. Pertanto, finché non viene raggiunta una dimensione massima del pacchetto o un numero di membri, il comando restituisce tutti i membri nell'insieme ordinato. Questa è chiamata iterazione completa. Perché alla fine della prima iterazione, riceviamo tutti e dieci i membri ei loro punteggi. Se abbiamo centinaia di membri, viene rappresentato come una tabella hash in memoria. Quindi, sono necessarie diverse iterazioni per restituire tutti i membri.

Il parametro COUNT può essere utilizzato per limitare il numero di membri restituiti in un'iterazione. Per impostazione predefinita, questo argomento è impostato su 10. Se l'insieme ordinato è costituito da centinaia di membri, è rappresentato da una tabella hash nella memoria. Quindi, il numero di membri restituiti è di circa dieci per iterazione. Il valore dell'argomento COUNT viene ignorato se l'insieme ordinato è troppo piccolo.

Caso d'uso 2: prendi i giocatori il cui nome inizia con la lettera 'J'

Il comando ZSCAN può essere utilizzato per filtrare i membri restituiti in base a una corrispondenza del modello. In tal caso, è necessario specificare l'argomento MATCH.

Usiamo lo stesso esempio del caso d'uso precedente. Il requisito è recuperare i giocatori il cui nome inizia con la lettera 'J'. È solo per implementare la prossima fantastica funzionalità relativa al gioco. L'argomento MATCH può essere specificato come segue:

Classifica zscan 0 incontro * J *

Questo dovrebbe idealmente restituire due membri i cui nomi sono Jeremy e John.

Conclusione

In sintesi, il comando ZSCAN viene utilizzato per scorrere i membri e i punteggi di un set ordinato Redis. Questo comando si comporta come il comando SCAN, tranne per il fatto che il comando ZSCAN accetta la chiave set come primo argomento. Come discusso nei casi d'uso, il comando ZSCAN può essere utilizzato in diversi modi specificando gli argomenti MATCH e COUNT in cui è possibile recuperare i membri e i punteggi associati che corrispondono a un modello specifico e limitare il conteggio dei membri restituito per iterazione. Nel complesso, il comando ZSCAN può essere utile quando si recuperano i membri di un set ordinato senza bloccare il server o il client.