Classements

Qu’est-ce qu’un leaderboard ou classement ?

Le concept des classements qui affichent les noms des personnes classées et les scores respectifs (ou autres points de données) des concurrents les mieux placés est un élément essentiel du monde des jeux sur ordinateur. Mais les classements dépassent le domaine des jeux. Ils touchent à la ludification, avec une mise en œuvre plus large qui peut inclure tout groupe de personne ayant un objectif commun (collaborateurs, étudiants, groupes de vente, groupes de gymnases, volontaires, etc.).

Les classements peuvent encourager la saine concurrence au sein d’un groupe en affichant ouvertement les scores de chaque membre du groupe. Ils apportent également une façon claire de visualiser les buts atteints de l’ensemble de l’équipe lorsque les membres poursuivent un même objectif.

Classements pour ludification

La ludification des tâches et des objectifs via des classements est une excellente façon de motiver les personnes en leur fournissant un feedback permanent sur leur position par rapport à d’autres membres du groupe. À condition d’être bien fait, ceci peut ajouter un élément de compétition saine qui contribue à la cohésion du groupe.

Voici un exemple graphique d’un classement simple qu’une entreprise pourrait utiliser pour motiver ses employés à participer au programme de santé de l’employeur.

Dans cet exemple, les employés peuvent voir les concurrents les mieux placés tout comme leurs scores actuels. Ils peuvent aussi voir le temps restant dans le concours et les prix de motivation. Bien entendu, au fur et à mesure que les données sont modifiées (lors de la vérification des utilisateurs des décomptes de pas), les classements changent en temps réel.

Il existe deux types de classements :

Classements absolus ils classent tous les concurrents avec une mesure générale. Ces classements comportent généralement les membres les mieux classés du groupe sous forme d’un Top 10.

Classements relatifs où les participants sont classés selon les différentes facettes des données de façon à ce que les membres soient regroupés selon des critères plus étroits ou relatifs. Ceci peut exiger l’établissement de calculs complexes pour découper les données de plusieurs façons. Un scénario de jeu commun, par exemple, est celui avec une vue montrant le classement d’un concurrent donné et des concurrents juste au-dessus et au-dessous de lui.

Défis dans les classements du jour

Dans notre monde connecté à Internet, les classements des jeux populaires peuvent être partagés par des centaines de milliers, voire des millions de concurrents. Ceci vaut également pour les usages non traditionnels des classements, comme les applications de fitness et de santé et les réseaux sociaux ou bien les tâches internes d’une organisation comme le service clientèle, la logistique ou la protection contre la fraude.

Les données utilisées pour les classements sont constamment mises à jour et les utilisateurs veulent voir comment les données sont découpées de plusieurs façons. Ceci fait des classements un excellent exemple d’analyse en temps réel et montre la vitesse à laquelle votre couche de données traite les opérations de lecture, écriture, tri et autres opérations clés.

Parmi les défis techniques posés par les classements :

  • L’intégration de millions d’utilisateurs.
  • Des calculs mathématiques sur un grand nombre d’attributs (analyse des données de plusieurs manières pour obtenir différentes vues des données).
  • La fourniture d’un accès en temps réel au classement avec un fort taux de disponibilité.
  • La possibilité pour les utilisateurs de partager leurs statistiques de classement sur les médias sociaux.
  • Permettre aux utilisateurs de recevoir des notifications comme les attributs qui les intéressent lors du changement du classement.
  • Permettre aux applications de mettre à jour les classements d’une manière totalement distribuée dans le monde entier et informations du site des actions, tout en fournissant une vue globale du statut du classement à partir de tous les sites.

Fournir les données en temps réel et faire en sorte que le système soit disponible est au-delà des possibilités de beaucoup de technologies de web. Ceci est toutefois un défi que Redis Enterprise résout grâce à des structures de données établies pour de tels cas et avec la gamme étendue d’options de déploiement de Redis Enterprise.

Pourquoi Redis Enterprise pour les classements?

Les Sorted Sets (ZSETs) au sein de Redis est une structure de données intégrée simplifiant la création et la manipulation des classements.

Redis Enterprise a pour base une architecture symétrique sans partage permettant la croissance linéaire et sans heurt des jeux de données et sans avoir besoin de modifier le code de l’application.

Redis Enterprise propose de nombreux modèles de haute disponibilité et vous permet de déployer Redis avec distribution géographique tout en permettant des latences locales pour vos utilisateurs lorsqu’ils en ont besoin.

Plusieurs options persistantes (AOF -Append Only Files, Fichiers seulement ajoutés, par écriture ou par seconde et captures d’écrans) n’entravant pas les performances vous assurent que vous n’avez pas besoin de reconstruire vos serveurs de base de données après les pannes.

Prise en charge de jeux de données extrêmement grands avec l’utilisation de mémoire intelligente avec accès à niveau (RAM, mémoire persistante ou flash) vous assure que vous pouvez jouer sur la taille de vos jeux de données pour répondre aux exigences de vos utilisateurs sans trop affecter la performance.

Sets triés en profondeur

La création d’un set trié (Sorted Set) est facile à l’aide de la commande Redis ZADD command. Par exemple, imaginez que vous devez ajouter un groupe de joueurs à un classement. À chaque joueur correspond un nom d’écran et le score du joueur qui changera continuellement.

Pour ajouter un joueur à un ensemble trié, il suffit d’utiliser la commande ZADD et d’intégrer le nom du set, un score et le nom du joueur :

ZADD players 200 Fred

Si le set n’existe pas encore, Redis le créera. S’il existe, Redis ajoute les nouvelles données au set existant. Tous les éléments de l’ensemble trié (Sorted Set) doivent être uniques de façon à ce que si le nom du joueur (membre) n’existe pas, il soit ajouté au set. Si le membre existe déjà, sa valeur sera adaptée en fonction de la nouvelle valeur fournie. Les commandes de Sorted Set intégrées vous permettent de réaliser des opérations de reporting en toute facilité, rapidement sur les données natives.

Par exemple, la commande ZRANGE renvoie une plage de membres. ZRANGEBYSCORE renvoie une plage de membres dans une plage de scores. ZRANK renvoie le classement d’un membre spécifique.

Redis facilite l’opération consistant à augmenter le score de n’importe quel joueur à l’aide de la commande ZINCRBY, qui inclut le nom du membre et le nombre de points à ajouter au score.

Vous pouvez en outre gérer plusieurs sets triés pour votre jeu et/ou application. Par exemple, un ensemble trié global inclut les scores agrégés de tous les tournois alors que plusieurs sets triés renvoient respectivement à un tournoi. Vous pouvez utiliser la fonction unique en son genre de Redis pour effectuer des opérations entre les sets triés, par exemple ZUNIONSTORE pour l’opération d’union avec et sans pondération.

Ces exemples simples de données n’affichent pas des données de type graphique. Ceci est un composant de la puissance des sets triés de Redis : Ils sont uniquement composés de données et ne sont pas liés à une quelconque vue. Ceci signifie que vous pouvez utiliser les données pour les afficher comme vous le désirez.

Comment créer un classement

Analysons brièvement le processus global de la mise en œuvre d’un classement dans Node.js conjointement à une app web déjà existante. Avec Node Package Manager (NPM), il est facile d’ajouter Redis à votre app web à l’aide de la simple commande npm install redis.

Once the Redis Node packages are installedUne fois les packages Redis Node installés sur votre projet d’app web, vous avez accès à la fonctionnalité de Redis par l’intermédiaire d’une interface JavaScript. (Les documents officiels sur le référentiel Github node_redis peuvent vous aider lors de cette étape de démarrage.)

Comme démonstration, nous allons créer une simple base de données à l’aide d’un Sorted Set. Nous créerons les membres qui s’appelleront [uniqueId], où uniqueId est une valeur entière pouvant facilement être générée par votre JavaScript ou code Python lorsqu’un joueur entre dans la compétition.

Le score peut être n’importe quelle donnée numérique que vous voulez utiliser pour classer les joueurs (nombre de pas quotidiens dans un programme de santé d’une entreprise, nombre d’extraterrestre tués dans un jeu sur ordinateur, etc.).

Les données de base du joueur auront cet aspect :

leaderboard-playerdata

Regardez maintenant un extrait du code Node.js que vous pouvez utiliser pour afficher les données.

Utilisez un Hash pour enregistrer des valeurs multiples

Vous pouvez créer un jeu de données pouvant être découpé par de nombreuses variables. Pour ce faire, il est utile d’enregistrer les données dans une structure représentant chacun des concurrents. Redis fournit justement cette structure, appelé Hash. Un Hash peut contenir de nombreux couples de valeurs associés avec une clé.

Vous pouvez utiliser une clé numérique simple comme identificateur unique dans votre Hash puis associer cette clé unique à un ensemble trié qui contiendra le score et la clé. De cette façon, vous pouvez rapidement obtenir le score pour vos concurrents leaders ou pour une plage de concurrents. Si vous désirez ensuite plus de données, vous pouvez facilement les obtenir du Hash à l’aide de la clé enregistrée dans le Sorted Set.

La création d’un Hash Redis est facile. Ce Hash, appelé touslesJoueurs, utilise le format suivant :

hset [ unique id (to identify the hash)] [property name] [property value] ...

Créez ensuite un nouveau Hash ayant pour nom une clé de joueur:100 et ajoutez une propriété screenName ayant la valeur Fred. Vous pourriez attribuer la valeur 100 à la clé du Hash, mais en utilisant le format de [stringID:IntegerID], vous le rendez un peu plus lisible. Pour ajouter un autre joueur, vous créerez une nouvelle clé de Hash, comme joueur:101.

hset player:100 screenName Fred

Si vous désirez récupérer toutes les propriétés et valeurs (paires nom-valeur) enregistrées pour un Hash spécifique, utilisez simplement cette commande :

hgetall player:100

Vous pouvez voir qu’il existe maintenant un couple nom-valeur.

1) "screenName"
2) "Fred"

Le Hash est une structure polyvalente et il est facile d’ajouter des propriétés et des valeurs de façon dynamique.

Imaginez que vous vouliez enregistrer la date de la dernière connexion du joueur:

hset player:100 lastLoggedIn 2019-07-30

Si vous rappelez hgetall, vous verrez :

1) "screenName"
2) "Fred"
3) "lastLoggedIn"
4) "2019-07-30"

Il suffit d’ajouter chacun des utilisateurs à votre Hash tousJoueurs avec son ID spécifique.  Vous pouvez alors les associer avec un ensemble trié contenant le score de chaque joueur.

Voici une représentation rapide de la façon selon laquelle vous pouvez lier vos données ensemble :

leaderboard-datachart

Une fois les Hashes ajoutés (joueur:NNN), vous disposez de votre liste et vous pouvez recourir à ces clés de données de joueur en les utilisant lorsque vous ajoutez des données au Sorted Set. Ceci est la manière de mettre en œuvre la puissance de la base de données intégrée à la mémoire de Redis pour travailler avec d’énormes jeux de données (des millions de joueurs !) qui suivent les classements de chacun des joueurs tout en restant incroyablement rapides.

Vous pouvez facilement mettre en œuvre une solution qui retire les données à l’aide de Node et le package node_redis de façon à ce que le classement soit rafraîchi sur votre app Web. Cette tâche facilitée par l’interface du package node_redis qui vous permet de récupérer l’ensemble trié en fonction de son nom (joueurClassement).

Redis Enterprise est essentiel pour rafraîchir votre classement et pour que vos utilisateurs reviennent voir leur classement.


Les prochaines étapes