Redis ZSCAN

Redis Zscan



Iterar sobre los miembros de un conjunto ordenado

Como todos saben, los conjuntos ordenados de Redis se derivan de los conjuntos regulares en los que cada miembro se ordena por su valor de puntuación en orden ascendente. Si dos o más miembros tienen el mismo valor de puntuación, se ordenan por orden lexicográfico. Por lo general, los miembros y las puntuaciones se pueden recuperar directamente mediante el comando ZRANGE. Cuando tiene un gran conjunto ordenado con miles de miembros, el comando ZRANGE puede bloquear el servidor durante mucho tiempo, como los comandos SMEMBERS y KEYS, lo cual es un inconveniente. Entonces, Redis ofrece un comando especial llamado ZSCAN que se deriva del comando SCAN para iterar sobre los miembros de un conjunto ordenado. Dado que el comando ZSCAN se hereda del comando SCAN, casi todos los comportamientos son los mismos que los del comando SCAN de propósito general.







Como en la figura dada, el comando ESCANEAR es un iterador basado en cursor. Por lo tanto, se necesitan una o más iteraciones para proporcionar todos los elementos de una colección de Redis. Dado que el comando ZSCAN se hereda del comando principal SCAN, el comportamiento es el mismo. En esta guía, se analizarán en detalle la sintaxis y los casos de uso del comando ZSCAN.



El comando ZSCAN

El comando ZSCAN es un iterador basado en cursores que inicia la iteración con el cursor 0. Posteriormente, en cada iteración, devuelve cero o más miembros del conjunto ordenado junto con el siguiente cursor que debe usarse como cursor para la siguiente llamada de comando. Si el cursor devuelto es 0 después de una o más iteraciones, significa que el proceso de escaneo ha terminado. Todos los miembros del conjunto ordenado se devuelven en este punto. Este proceso se denomina iteración completa. Como puede ver, el comando ZSCAN mantiene su estado solo usando un cursor que conduce a una conciencia de estado limitada. Por lo tanto, los siguientes inconvenientes están asociados con el comando ZSCAN.



  • El mismo elemento puede regresar en múltiples iteraciones.
  • Si un miembro no está presente al comienzo del proceso de escaneo, existe la probabilidad de que no se devuelva ese miembro durante una iteración completa.

Además, no hay garantía sobre el recuento de los miembros devueltos. En algunos casos, si el conjunto ordenado es muy pequeño, todos los miembros pueden devolverse en la primera iteración. Porque Redis usa un formato especial de codificación empaquetada de asignación única para mantener a los miembros hasta que se alcanza un recuento máximo de elementos. El comando ZSCAN solo puede devolver un cursor si la estructura de datos escaneada se representa como una tabla hash.





Sintaxis:
El comando ZSCAN usa casi la misma sintaxis que el comando SCAN excepto que acepta una clave de conjunto ordenado como primer argumento. La sintaxis del comando con los argumentos permitidos es la siguiente:

Cursor ZSCAN sorted_set_key [ patrón de coincidencia ] [ COUNT número_de_miembros ]

sorted_set_key : La clave del conjunto ordenado.
Cursor : El valor del cursor comienza en 0 y termina en 0 si se trata de una iteración completa.



Los siguientes argumentos son opcionales:

JUEGO : Un patrón para hacer coincidir al recuperar los elementos en cada iteración. Solo se devuelven los miembros coincidentes.
CONTAR : El número aproximado de miembros que se devolverán en cada iteración.

El conjunto de resultados devuelto por iteración contiene un par de elementos. La primera parte es un entero sin signo de 64 bits que representa el cursor que se pasará a la siguiente llamada. La siguiente parte es una matriz de miembros y puntuaciones asociadas.

Caso de uso 1: recuperar todos los miembros y sus misiones completadas de un juego en línea

Supongamos que una empresa de juegos en línea mantiene una tabla de clasificación utilizando el conjunto ordenado de Redis. Dado que los usuarios masivos están jugando activamente, necesitan una forma de recuperar a cada jugador y su puntuación asociada, que es la cantidad de misiones completadas. Es imprescindible realizar la recuperación sin bloquear el servidor. Entonces, la recomendación es usar el comando ZSCAN de la siguiente manera:

Primero, creamos un conjunto ordenado con algunos jugadores y el número de misiones completadas.

Tabla de clasificación de zadd 12 Jugador 6: Juan 4 Jugador 2: María 22 Jugador 1: Patel 15 Jugador: 11 23 Jugador 5: Ann 30 Jugador 7: Duro 23 Jugador 12: abby 2 Jugador 13: Nicky 6 Jugador 9: Jeremy 7 Jugador 45: Kina

Ahora, podemos iterar sobre los miembros del conjunto ordenado de la siguiente manera:

Tabla de clasificación de zscan 0

Producción:

El valor del cursor es 0 en el conjunto de resultados devuelto, lo que significa que todos los miembros se devuelven al final de la primera iteración. En este caso, debido a que la cantidad de miembros es pequeña, Redis representa estos miembros mediante una codificación empaquetada de asignación única. Por lo tanto, hasta que se alcanza un tamaño máximo de paquete o un número de miembros, el comando devuelve todos los miembros del conjunto ordenado. Esto se llama una iteración completa. Porque al final de la primera iteración, recibimos los diez miembros y sus puntajes. Si tenemos cientos de miembros, se representa como una tabla hash en la memoria. Por lo tanto, se necesitan varias iteraciones para devolver todos los miembros.

El parámetro COUNT se puede usar para limitar el número de miembros devueltos en una iteración. De forma predeterminada, este argumento se establece en 10. Si el conjunto ordenado consta de cientos de miembros, se representa mediante una tabla hash en la memoria. Entonces, el número de miembros devueltos es de alrededor de diez por iteración. El valor del argumento COUNT se ignora si el conjunto ordenado es demasiado pequeño.

Caso de uso 2: Obtener los jugadores cuyo nombre comienza con la letra 'J'

El comando ZSCAN se puede utilizar para filtrar los miembros devueltos en función de una coincidencia de patrón. En ese caso, se debe especificar el argumento MATCH.

Usemos el mismo ejemplo del caso de uso anterior. El requisito es buscar a los jugadores cuyo nombre comienza con la letra 'J'. Es solo para implementar la próxima característica genial relacionada con el juego. El argumento MATCH se puede especificar de la siguiente manera:

Tabla de clasificación de zscan 0 juego * j *

Idealmente, esto debería devolver dos miembros cuyos nombres son Jeremy y John.

Conclusión

En resumen, el comando ZSCAN se utiliza para iterar sobre los miembros y las puntuaciones de un conjunto ordenado de Redis. Este comando se comporta igual que el comando SCAN, excepto que el comando ZSCAN acepta la tecla set como primer argumento. Como se discutió en los casos de uso, el comando ZSCAN se puede usar de diferentes maneras especificando los argumentos MATCH y COUNT donde puede recuperar los miembros y las puntuaciones asociadas que coinciden con un patrón específico y limitan el recuento de miembros devuelto por iteración. En general, el comando ZSCAN puede resultar útil para recuperar los miembros de un conjunto ordenado sin bloquear el servidor o el cliente.