Redis ZSCAN

Redis Zscan



Iterar sobre els membres d'un conjunt ordenat

Com tots sabeu, els conjunts ordenats de Redis es deriven dels conjunts normals on cada membre està ordenat pel seu valor de puntuació en ordre ascendent. Si dos o més membres tenen el mateix valor de puntuació, s'ordenen per ordre lexicogràfic. Normalment, els membres i les puntuacions es poden recuperar directament mitjançant l'ordre ZRANGE. Quan teniu un gran conjunt ordenat amb milers de membres, l'ordre ZRANGE pot bloquejar el servidor durant molt de temps, com les ordres SMEMBERS i KEYS, que és un inconvenient. Per tant, Redis ofereix una ordre especial anomenada ZSCAN que es deriva de l'ordre SCAN per iterar sobre els membres d'un conjunt ordenat. Com que l'ordre ZSCAN hereta de l'ordre SCAN, gairebé tots els comportaments són els mateixos que l'ordre SCAN de propòsit general.







Com a la figura donada, l'ordre SCAN és un iterador basat en cursor. Per tant, cal una o més iteracions per proporcionar tots els elements d'una col·lecció Redis. Com que l'ordre ZSCAN hereta de l'ordre SCAN principal, el comportament és el mateix. En aquesta guia, es tractaran detalladament la sintaxi i els casos d'ús de l'ordre ZSCAN.



La comanda ZSCAN

L'ordre ZSCAN és un iterador basat en cursor que comença la iteració amb el cursor 0. Després, en cada iteració, retorna zero o més membres de conjunt ordenats juntament amb el cursor següent que s'hauria d'utilitzar com a cursor per a la següent crida d'ordres. Si el cursor retornat és 0 després d'una o més iteracions, vol dir que el procés d'escaneig ha acabat. Tots els membres del conjunt ordenats es retornen en aquest moment. Aquest procés s'anomena iteració completa. Com podeu veure, l'ordre ZSCAN manté el seu estat només utilitzant un cursor que condueix a una consciència limitada de l'estat. Per tant, els inconvenients següents estan associats a l'ordre ZSCAN.



  • El mateix element pot tornar en múltiples iteracions.
  • Si un membre no està present a l'inici del procés d'escaneig, hi ha una probabilitat de no retornar aquest membre durant una iteració completa.

A més, no hi ha cap garantia sobre el recompte de membres retornats. En alguns casos, si el conjunt ordenat és molt petit, es poden tornar tots els membres en la primera iteració. Perquè Redis utilitza un format especial de codificació empaquetada d'assignació única per retenir els membres fins que s'arribi a un nombre màxim d'elements. L'ordre ZSCAN només pot tornar un cursor si l'estructura de dades escanejada es representa com una taula hash.





Sintaxi:
L'ordre ZSCAN utilitza gairebé la mateixa sintaxi que l'ordre SCAN, excepte que accepta una clau de conjunt ordenada com a primer argument. La sintaxi de l'ordre amb els arguments permesos és la següent:

Cursor ZSCAN sortd_set_key [ Patró MATCH ] [ COUNT membres_count ]

clau_conjunta_ordenada : La clau del conjunt ordenat.
Cursor : El valor del cursor comença des de 0 i acaba en 0 si és una iteració completa.



Els arguments següents són opcionals:

PARTIT : un patró per fer coincidir en recuperar els elements en cada iteració. Només es retornen els membres coincidents.
COMPTE : el nombre aproximat de membres que es retornarà en cada iteració.

El conjunt de resultats retornats per iteració conté un parell d'elements. La primera part és un nombre enter sense signe de 64 bits que representa el cursor que s'ha de passar a la següent trucada. La següent part és una sèrie de membres i puntuacions associades.

Cas d'ús 1: recupera tots els membres i les seves missions completades d'un joc en línia

Suposem que una empresa de jocs en línia manté una taula de classificació utilitzant el conjunt ordenat de Redis. Com que els usuaris massius estan jugant activament al joc, necessiten una manera de recuperar cada jugador i la seva puntuació associada, que és el nombre de missions completades. És imprescindible realitzar la recuperació sense bloquejar el servidor. Per tant, la recomanació és utilitzar l'ordre ZSCAN de la següent manera:

Primer, creem un conjunt ordenat amb alguns jugadors i el nombre completat de missions.

Zadd Leaderboard 12 Jugador 6: Joan 4 Jugador 2: Mary 22 Jugador 1: Patel 15 Jugador: 11 23 Jugador 5: Ann 30 Jugador 7: dur 23 Jugador 12: abby 2 Jugador 13: Nicky 6 Jugador 9: Jeremy 7 Jugador 45: Kina

Ara, podem iterar sobre els membres del conjunt ordenat de la següent manera:

zscan Leaderboard 0

Sortida:

El valor del cursor és 0 al conjunt de resultats retornats, la qual cosa significa que tots els membres es retornen al final de la primera iteració. En aquest cas, com que el nombre de membres és petit, Redis representa aquests membres mitjançant una codificació empaquetada d'assignació única. Per tant, fins que s'arribi a la mida màxima del paquet o al nombre de membres, l'ordre retorna tots els membres del conjunt ordenat. Això s'anomena una iteració completa. Perquè al final de la primera iteració, rebem els deu membres i les seves puntuacions. Si tenim centenars de membres, es representa com una taula hash a la memòria. Per tant, calen diverses iteracions per tornar tots els membres.

El paràmetre COUNT es pot utilitzar per limitar el nombre de membres retornats en una iteració. Per defecte, aquest argument s'estableix en 10. Si el conjunt ordenat consta de centenars de membres, es representa amb una taula hash a la memòria. Per tant, el nombre de membres retornats és d'uns deu per iteració. El valor de l'argument COUNT s'ignora si el conjunt ordenat és massa petit.

Cas d'ús 2: busqueu els jugadors el nom dels quals comenci amb la lletra 'J'

L'ordre ZSCAN es pot utilitzar per filtrar els membres retornats en funció d'una coincidència de patró. En aquest cas, s'ha d'especificar l'argument MATCH.

Utilitzem el mateix exemple del cas d'ús anterior. El requisit és buscar els jugadors el nom dels quals comenci per la lletra 'J'. És només per implementar la següent característica interessant relacionada amb el joc. L'argument MATCH es pot especificar de la següent manera:

zscan Leaderboard 0 partit * J *

Idealment, això hauria de tornar dos membres els noms dels quals són Jeremy i John.

Conclusió

En resum, l'ordre ZSCAN s'utilitza per iterar sobre els membres i les puntuacions d'un conjunt ordenat de Redis. Aquesta ordre es comporta igual que l'ordre SCAN, excepte que l'ordre ZSCAN accepta la clau de configuració com a primer argument. Tal com s'ha comentat als casos d'ús, l'ordre ZSCAN es pot utilitzar de diferents maneres especificant els arguments MATCH i COUNT on podeu recuperar els membres i les puntuacions associades que coincideixen amb un patró específic i limitar el nombre de membres retornats per iteració. En general, l'ordre ZSCAN pot ser útil a l'hora de recuperar els membres d'un conjunt ordenat sense bloquejar el servidor o el client.