Tablas de clasificación

¿Qué es una Tabla de clasificación?

Te explicamos el concepto de tabla de clasificación. Es un marcador que muestra los nombres clasificados y las puntuaciones actuales (u otros datos) de los principales competidores, es esencial en el mundo de los juegos de ordenador, pero las tablas de clasificación van ahora más allá de los juegos. Hablamos gamificación, una aplicación más amplia que puede incluir a cualquier grupo de personas con un objetivo común (compañeros de trabajo, estudiantes, grupos de ventas, grupos de fitness, voluntarios, etc.).

Las tablas de clasificación pueden fomentar una sana competencia en un grupo al mostrar abiertamente la clasificación actual de cada miembro del grupo. También son una forma clara de ver los logros continuos de todo el equipo a medida que los miembros avanzan hacia un objetivo.

Tablas de clasificación para gamificación

La gamificación de las tareas y los objetivos a través de tablas de clasificación es una forma estupenda de motivar a tus personas, al proporcionarles información constante sobre su posición en comparación con otros miembros del grupo. Si lo hace bien, puedes fomentar una competencia sana que fomente la cohesión del grupo.

Este es un ejemplo gráfico de una sencilla tabla de clasificación que una empresa podría utilizar para motivar a sus empleados a participar en su programa de salud para empresas.

En este ejemplo, los empleados pueden ver los competidores mejor clasificados junto con sus puntuaciones actuales. También pueden ver el tiempo que queda en el concurso y los premios de motivación. Por supuesto, a medida que cambian los datos (a medida que los usuarios suben recuentos de pasos verificados) las clasificaciones cambian en tiempo real.

Estos son los dos tipos de tablas de clasificaciones:

Tablas de clasificación absolutas que clasifican a todos los competidores según alguna medida global. Por lo general muestran los miembros mejor clasificados del grupo, como un Top 10.

Tablas de clasificación relativas; que clasifican a los participantes en relación con diferentes facetas de los datos, de manera que los miembros se agrupan según criterios más estrechos o relativos. Puede requerir cálculos complejos para deslizar los datos de numerosas maneras. En un juego común, por ejemplo, es una vista que muestra la clasificación de un determinado competidor y los competidores justo por encima y por debajo de él.

¿Qué desafíos que presentan las tablas de clasificación en la actualidad?

En nuestro mundo conectado a Internet, las tablas de clasificación de los juegos más populares pueden ser compartidas por cientos de miles, incluso millones, de competidores. Lo mismo ocurre con los usos no tradicionales de las tablas de clasificación, como las aplicaciones de fitness y salud y las redes sociales, o las tareas organizativas internas, como el servicio al cliente, la logística o la mitigación del fraude.

Los datos utilizados para las tablas de clasificación se actualizan constantemente y los usuarios quieren ver los datos segmentados de muchas maneras. Por eso, las tablas de clasificación son un gran ejemplo de análisis en tiempo real en acción, así como un escaparate de la velocidad a la que tu capa de datos maneja las lecturas, las escrituras, la clasificación y otras operaciones clave.

Aquí te dejamos otros desafíos técnicos que plantean las tablas de clasificación:

  • Escala masiva en millones de usuarios
  • Cálculos matemáticos sobre un gran número de atributos (analizan los datos de numerosas maneras para obtener diferentes puntos de vista de los datos)
  • Proporcionar acceso a la tabla de clasificación en tiempo real con alta disponibilidad
  • Permitir que los usuarios compartan sus estadísticas en las redes sociales
  • Permitir que los usuarios reciban notificaciones cuando cambien los atributos que les interesan en la tabla de clasificación
  • Permitir que las aplicaciones actualicen las tablas de clasificación de forma totalmente distribuida en todo el mundo y en el lugar donde se realicen las acciones y ofrecer una visión global del estado de la tabla de clasificación desde cualquier lugar

Proporcionar estos datos en tiempo real y mantener el sistema disponible está fuera del alcance de muchas tecnologías web. La buena noticia es que Redis Enterprise resuelve todos estos desafíos con estructuras de datos construidas para casos de uso como estos, y con la variedad de opciones de implementación que ofrece Redis Enterprise.

Entonces, ¿por qué utilizar Redis Enterprise para las tablas de clasificación?

Los conjuntos ordenados (ZSETs) dentro de Redis son una estructura de datos incorporada que hace que las tablas de clasificación sean sencillas de crear y manipular.

Redis Enterprise se basa en una arquitectura simétrica y de uso compartido que permite que el tamaño de los conjuntos de datos crezca de forma lineal y sin problemas, sin necesidad de realizar cambios en el código de la aplicación.

Redis Enterprise ofrece múltiples modelos de alta disponibilidad y permite desplegar Redis de forma distribuida geográficamente a la vez que permite latencias locales para sus usuarios cuando sea necesario.

Las múltiples opciones de persistencia (AOF por escritura o por segundo e instantáneas) que no afectan al rendimiento garantizan que no será necesario reconstruir los servidores de bases de datos tras haber experimentado un fallo.

La compatibilidad con  conjuntos de datos extremadamente grandes  mediante la utilización de un acceso inteligente por niveles a la memoria (RAM, memoria persistente o Flash) garantiza la posibilidad de escalar los conjuntos de datos con las demandas de los usuarios sin afectar significativamente al rendimiento.

Conjuntos ordenados en profundidad

Si quieres crear un conjunto ordenado, es fácil utiliza el comando ZADD  de Redis. Por ejemplo, imagina que estás añadiendo un conjunto de jugadores a una tabla de clasificación. Cada jugador se compone de un nombre de pantalla y la puntuación del jugador, que cambiará continuamente con el tiempo

Añadir un jugador a un Conjunto ordenado es tan fácil como utilizar el comando ZADD y pasar el nombre del conjunto, una puntuación y el nombre del jugador:

ZADD jugador 200 Fred

Si todavía no existe el conjunto, Redis lo creará por ti. Si existe, Redis añade los nuevos datos al conjunto existente. Cada elemento del Conjunto ordenado debe ser único, por lo que si el nombre del jugador (miembro) no existe, se añadirá al conjunto. Y si el miembro ya existe, su valor se establecerá al nuevo valor proporcionado. Los comandos de Conjunto ordenado incorporados te permiten llevar a cabo con rapidez y facilidad clasificaciones e informes.

Por ejemplo, el comando ZRANGE devuelve un rango de miembros. ZRANGEBYSCORE devuelve un rango de miembros dentro de un rango de puntuaciones. ZRANK devuelve la clasificación de un miembro especificado.

Redis facilita el incremento de la puntuación de cualquier jugador utilizando el comando ZINCRBY, indicando el nombre del miembro y la cantidad en la cual se debe incrementar la puntuación.

Además, puedes gestionar varios Conjuntos ordenados para su juego/aplicación. Por ejemplo, un Conjunto ordenado global incluye las puntuaciones agregadas de todos los torneos y luego múltiples conjuntos ordenados, por cada torneo. Puedes utilizar la capacidad única de Redis para operar entre conjuntos ordenados, por ejemplo ZUNIONSTORE para la operación de unión con y sin puntuaciones.

Estos sencillos ejemplos de datos no muestran datos de tipo gráfico, pero eso es parte de las posibilidades que ofrecen los Conjuntos ordenados de Redis Sorted Set: son puros datos en memoria y no están enlazados a ninguna vista. Eso significa que se pueden utilizar los datos para mostrarlos de la forma deseada.

Y ¿cómo creo una tabla de clasificación?

Echemos un vistazo rápido y de alto nivel a cómo implementar una tabla de clasificación en Node.js junto a una aplicación web previamente existente. Con el gestor de paquetes de Node (NPM), es fácil añadir Redis a su aplicación web mediante el comando npm install redis.

Una vez que los paquetes de Redis Node estén instalados en tu proyecto de aplicación web, puede acceder a la funcionalidad de Redis a través de una API de JavaScript. (Para comenzar, utiliza la documentación oficial en the node_redis Github repository )

Vamos ahora a crear una simple base de datos en memoria utilizando el Conjunto ordenado, para que te sirva de demostración. Crearemos miembros llamados player:[uniqueId], donde uniqueId es un valor entero que podría ser fácilmente generado por su código JavaScript o Python cuando un usuario se une a la competición.

La puntuación puede ser cualquier dato numérico que se quieras utilizar para clasificar a los jugadores (pasos diarios en un programa de salud de la empresa, alienígenas abatidos en un juego de ordenador, etc.).

Los datos básicos del jugador serán algo así:

leaderboard-playerdata

Veamos ahora un poco de código Node.js que puedes usar para mostrar los datos.

Utilizar un Hash para almacenar múltiples valores

Puedes crear un conjunto de datos que se puede segmentar utilizando numerosas variables. Para ello, es útil almacenar los datos en una estructura que represente a cada competidor. Redis te proporciona precisamente una estructura de este tipo, denominada Hash. Un Hash puede contener numerosos pares nombre-valor asociados a una clave.

Puedes utilizar una clave numérica simple como identificador único en tu hash, y luego asociar esa clave única con un Conjunto ordenado, que contendrá la puntuación y la clave. Puedes obtener rápidamente la puntuación de tus principales competidores o de una serie de competidores. Si luego quieres más datos, es fácil: puede obtenerlosdel Hash utilizando el valor de la clave almacenada en el Conjunto ordenado.

Crear un Hash de Redis es fácil. Este Hash, denominado allPlayers, utiliza el siguiente formato:

hset [ id único (para identificar el hash)] [nombre de la propiedad] [valor de la propiedad] ...

Te toca a ti, crea un nuevo Hash con la clave player:100 y añade una propiedad screenName con el valor Fred. Podrías crear simplemente la clave hash 100, pero usar el formato de [stringID:IntegerID] lo hace un poco más legible. Cuando añadas otro jugador, crearás una nueva clave Hash, como player:101.

hset jugador:100 screenName Fred

Si quieres recuperar todas las propiedades y valores (pares nombre-valor) almacenados para un hash en particular, solo tienes que utilizar este comando:

hgetall jugador:100

En este momento podrás ver que hay un par nombre-valor.

1) "screenName"
2) "Fred"

El Hash es una estructura flexible y es fácil añadirle propiedades y valores dinámicamente.

Imagina que quieres guardar la fecha en que el jugador se conectó por última vez:

hset player:100 lastLoggedIn 2019-07-30

Al activar de nuevo hgetall, verás lo siguiente:

Solo es cuestión de añadir cada usuario a su Hash allPlayers con su IID. única. A continuación, asócialas a un Conjunto ordenado que contendrá la puntuación de cada jugador.

Mira este rápido gráfico para ver cómo podrías unir los datos:

leaderboard-datachart

Una vez que añadas los Hashes (player:NNN) entonces tendrás tu lista y podrás aprovechar esas claves de datos de los jugadores utilizándolas cuando añada datos al Conjunto ordenado. Así es como se aprovecha el potencial de la base de datos en memoria Redis para trabajar con conjuntos de datos enormes (¡millones de jugadores!) que hace un seguimiento a las clasificaciones de cada jugador, pero con un rendimiento increíblemente rápido.

Ahora puedes implementar fácilmente una solución que extraiga los datos utilizando Node y el paquete node_redis para mantener la tabla de clasificación actualizada en tu aplicación web. Esto se logra con facilidad utilizando la API del paquete node_redis, que permite recuperar el conjunto ordenado por nombre (playerRank).

Recuerda, Redis Enterprise es esencial para mantener tu tabla de clasificación actualizada y para que sus usuarios vuelvan a ver sus clasificaciones.

Próximos pasos