Redis Zscan

Redis Zscan

Iterar sobre los miembros de un set ordenado

Como todos saben, los conjuntos ordenados redis se derivan de los conjuntos regulares donde cada miembro está ordenado por su valor de puntaje en orden ascendente. Si dos o más miembros tienen el mismo valor de puntaje, se ordenan por orden lexicográfico. Por lo general, los miembros y los puntajes se pueden recuperar directamente utilizando el comando zrange. Cuando tiene un gran conjunto ordenado con miles de miembros, el comando ZRange podría bloquear el servidor durante mucho tiempo, como los comandos de SMembers y Keys, que es un inconveniente. Entonces, Redis ofrece un comando especial llamado ZSCan que se deriva del comando de escaneo para iterar sobre los miembros de un conjunto ordenado. Dado que el comando ZSCAN hereda del comando de escaneo, casi todos los comportamientos son los mismos que el comando de escaneo de propósito general.

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

El comando zscan

El comando ZSCan es un iterador basado en el cursor 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 clasificados se devuelven en este momento. Este proceso se llama iteración completa. Como puede ver, el comando ZSCAN mantiene su estado solo usando un cursor que conduce a una conciencia estatal limitada. Por lo tanto, los siguientes inconvenientes están asociados con el comando ZSCAN.

  • El mismo elemento puede volver en múltiples iteraciones.
  • Si un miembro no está presente al comienzo del proceso de escaneo, existe la probabilidad de no devolver a 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 podrían ser devueltos en la primera iteración. Porque Redis utiliza un formato de codificación empaquetado de asignación única especial para contener a los miembros hasta que se alcance un recuento de elementos máximos. 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 de escaneo, excepto que acepta una clave de conjunto ordenada como el primer argumento. La sintaxis del comando con los argumentos permitidos es el siguiente:

ZSCAN SATED_SET_KEY CURSOR [Patrón de coincidencia] [Count Member_Count]

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

Los siguientes argumentos son opcionales:

FÓSFORO: Un patrón a 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 transmitirá a la siguiente llamada. La siguiente parte es una variedad de miembros y puntajes asociados.

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

Supongamos que una compañía de juegos en línea mantiene una tabla de clasificación utilizando el set Redis Ordenado. Dado que los usuarios masivos están jugando activamente, necesitan una forma de recuperar a cada jugador y su puntaje asociado, que es el número 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 completado de misiones.

ZADD RIARDBOARD 12 Player6: John 4 Player2: Mary 22 Player1: Patel 15 Jugador: 11 23 Jugador5: Ann 30 Jugador7: Harsh 23 Player12: Abby 2 Player13: Nicky 6 Player9: Jeremy 7 Player45: Kina

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

ZScan Raeadboard 0

Producción:

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

El parámetro de conteo se puede usar para limitar el número de miembros devueltos en una iteración. Por defecto, este argumento se establece en 10. Si el conjunto ordenado consta de cientos de miembros, está representado por 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 de recuento se ignora si el conjunto ordenado es demasiado pequeño.

Caso de uso 2 - Obtenga a los jugadores cuyo nombre comienza con la letra "J"

El comando ZSCAN se puede usar para filtrar los miembros devueltos en función de una coincidencia de patrón. En ese caso, el argumento del partido debe especificarse.

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 de la coincidencia se puede especificar de la siguiente manera:

ZScan Raeperboard 0 Match *J *

Esto idealmente debería devolver a dos miembros cuyos nombres son Jeremy y John.

Conclusión

En resumen, el comando ZSCAN se usa para iterar sobre los miembros y las puntuaciones de un set clasificado Redis. Este comando se comporta lo mismo que el comando de escaneo, excepto que el comando ZSCAN acepta la clave establecida como el primer argumento. Como se discutió en los casos de uso, el comando ZSCAN se puede usar de diferentes maneras especificando los argumentos de coincidencia y recuento en los que 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 ser útil al recuperar a los miembros de un conjunto ordenado sin bloquear el servidor o el cliente.