Redis®*: Classer les utilisateurs en temps réel

Apprenez à classer 2 millions d'utilisateurs par score en temps réel avec Redis

👋 Bienvenue sur la documentation de Stackhero !

Stackhero propose une solution Redis cloud prête à l'emploi offrant de nombreux avantages, notamment :

  • Interface web Redis Commander incluse.
  • Taille et transferts de messages illimités.
  • Mises à jour simplifiées en un clic.
  • Performance optimale et sécurité renforcée grâce à une VM privée et dédiée.

Gagnez du temps et simplifiez-vous la vie : il suffit de 5 minutes pour essayer la solution d'hébergement Redis cloud de Stackhero !

L'un de nos clients nous a contactés avec un défi intéressant. Il gère un site web sportif où les utilisateurs gagnent des points lorsqu'ils remportent des paris ou accomplissent diverses actions.

Son objectif était d'afficher le classement de chaque utilisateur, de montrer les utilisateurs immédiatement au-dessus et en dessous d'eux, et de générer un classement des 100 meilleurs. Avec une communauté de 2 millions d'utilisateurs, les données devaient être traitées en temps réel !

Chez Stackhero, nous aimons relever des défis comme celui-ci. Dans cet article, nous vous guiderons à travers notre solution étape par étape.

Les bases de données traditionnelles telles que MySQL, PostgreSQL ou Elasticsearch ne sont pas conçues pour des tâches de classement à faible latence. Cela nous a poussés à explorer une autre option.

Nous avons sélectionné Redis, une base de données en mémoire extrêmement rapide et fiable. Selon DB-Engines, c'est la 7ème base de données la plus utilisée au monde et l'option leader dans la catégorie "Key-value store".

Redis offre plusieurs modèles de données. Pour ce scénario, un modèle se distingue : les "sorted sets".

Les sorted sets combinent une clé et un score. Dans notre cas, la clé est l'ID utilisateur et le score représente les points de l'utilisateur.

Nous avons commencé par lancer un service Redis sur Stackhero. Le service est opérationnel en seulement 2 minutes avec la dernière version stable, propose une facturation à l'heure et dispose de Redis Commander, une interface web pratique. Nous avons validé le concept en utilisant cette interface.

Nous avons ajouté trois utilisateurs avec des IDs et scores d'exemple comme indiqué ci-dessous :

| Nom d'utilisateur | Score | | - | - | | userId1 | 11 | | userId2 | 54 | | userId3 | 24 |

Ces utilisateurs ont été ajoutés à un sorted set appelé usersScores en utilisant les commandes Redis suivantes :

ZADD usersScores 11 "userId1"
ZADD usersScores 54 "userId2"
ZADD usersScores 24 "userId3"

Redis Commander, l'interface web fournie sur Stackhero avec les instances RedisRedis Commander, l'interface web fournie sur Stackhero avec les instances Redis

Ensuite, nous avons récupéré le score de userId1 :

ZSCORE usersScores "userId1"
> 11

Cela a confirmé que le score pour userId1 était bien 11. Après cela, nous avons vérifié le rang de userId1 :

ZREVRANK usersScores "userId1"
> 2

Rappelez-vous, le classement commence à 0. Cela signifie que les classements sont les suivants :

| Nom d'utilisateur | Score | Rang | | - | - | - | | userId1 | 11 | 2 | | userId2 | 54 | 0 | | userId3 | 24 | 1 |

La commande ZREVRANK a retourné 2, ce qui est exactement ce que nous attendions pour userId1.

Vous pouvez également récupérer les meilleures entrées. Par exemple, pour récupérer les 2 premiers utilisateurs (du rang 0 au rang 1) exécutez :

ZREVRANGE usersScores 0 1 WITHSCORES
> 1) userId2
> 2) 54
> 3) userId3
> 4) 24

Pour obtenir les 100 meilleurs utilisateurs, exécutez simplement :

ZREVRANGE usersScores 0 99 WITHSCORES

Cette approche est efficace et parfaitement adaptée au classement en temps réel haute performance.

Voici quelques commandes Redis supplémentaires utilisées sur le site web de notre client :

  • Obtenir les utilisateurs classés entre les positions 50 et 100 : ZREVRANGE usersScores 50 100 WITHSCORES
  • Ajouter un utilisateur : ZADD usersScores 40 "userId4"
  • Mettre à jour le score d'un utilisateur (cela remplace l'entrée existante userId4) : ZADD usersScores 42 "userId4"
  • Supprimer un utilisateur : ZREM usersScores "userId4"

Après avoir validé le concept dans Redis Commander, il est temps d'intégrer Redis dans du code réel. Notre client utilise Node.js et voici un exemple utilisant ioredis comme client :

const Redis = require('ioredis');

(async () => {
  // Définir les identifiants Redis
  // Si vous utilisez Stackhero, vous les trouverez sur le tableau de bord Stackhero
  const redis = new Redis({
    host: '<redisServerHost>',
    password: '<redisServerPassword>',
    port: <PORT_TLS>, // <PORT_CLEAR> est pour les connexions non sécurisées et <PORT_TLS> est pour TLS. TLS doit être utilisé.
    tls: {}, // Fournir un objet vide pour activer TLS
    lazyConnect: true
  });

  // Se connecter à Redis
  await redis.connect();

  // Ajouter des utilisateurs
  await redis.zadd('usersScores', 11, 'userId1');
  await redis.zadd('usersScores', 54, 'userId2');
  await redis.zadd('usersScores', 24, 'userId3');

  // Récupérer le score de userId1
  const score = await redis.zscore('usersScores', 'userId1');
  console.log('userId1 a ' + score + ' points');

  // Récupérer la position de classement de userId1
  const rankPosition = await redis.zrevrank('usersScores', 'userId1');
  console.log('userId1 est classé à la position ' + rankPosition);

  // Se déconnecter de Redis
  await redis.disconnect();
})();

Ce simple mais puissant extrait de code est idéal pour gérer les données de classement en temps réel.

Relever ce problème a été à la fois intéressant et stimulant. Dans notre cas, Redis s'est avéré être une solution idéale car il est facile à utiliser, puissant et exceptionnellement rapide.

Si vous souhaitez expérimenter avec Redis, vous pouvez démarrer une instance sur Stackhero en seulement 2 minutes. Profitez de la dernière version stable, d'une interface web, de sauvegardes et de performances impressionnantes à portée de main.

Tableau de bord Stackhero montrant les services Node.js et Redis en cours d'exécutionTableau de bord Stackhero montrant les services Node.js et Redis en cours d'exécution