Redis®*: Classer les utilisateurs en temps réel
Découvrez comment 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 qui offre de nombreux avantages, notamment :
- Interface web Redis Commander incluse.
- Taille des messages et transferts 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 Redis cloud hosting de Stackhero !
L'un de nos clients nous a soumis un défi intéressant. Il gère un site sportif où les utilisateurs gagnent des points lorsqu'ils remportent des paris ou accomplissent différentes actions.
Son objectif était d'afficher le classement de chaque utilisateur, de montrer les utilisateurs immédiatement au-dessus et en dessous, et de générer un classement top 100. Avec une communauté de 2 millions d'utilisateurs, les données devaient être traitées en temps réel !
Chez Stackhero, nous aimons relever ce type de challenge. Dans cet article, nous vous présentons notre solution étape par étape.
Pourquoi nous avons choisi Redis
Les bases de données traditionnelles comme MySQL, PostgreSQL ou Elasticsearch ne sont pas conçues pour des tâches de classement à faible latence. Cela nous a amenés à explorer une autre option.
Nous avons choisi 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 la première dans la catégorie "Key-value store".
Redis propose plusieurs modèles de données. Pour ce cas d'usage, l'un d'eux se distingue : les "sorted sets".
Validations techniques
Les sorted sets associent une clé et un score. Dans notre cas, la clé correspond à 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 intègre Redis Commander, une interface web pratique. Nous avons validé le concept via cette interface.
Nous avons ajouté trois utilisateurs avec des IDs et scores d'exemple comme ci-dessous :
| Nom d'utilisateur | Score | | - | - | | userId1 | 11 | | userId2 | 54 | | userId3 | 24 |
Ces utilisateurs ont été ajoutés à un sorted set nommé usersScores avec 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 Redis
Ensuite, nous avons récupéré le score de userId1 :
ZSCORE usersScores "userId1"
> 11
Cela a confirmé que le score de userId1 était bien 11. Après cela, nous avons vérifié le rang de userId1 :
ZREVRANK usersScores "userId1"
> 2
Pour rappel, 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 correspond exactement à ce que nous attendions pour userId1.
Vous pouvez également récupérer les meilleures entrées. Par exemple, pour obtenir 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 le top 100, il suffit d'exécuter :
ZREVRANGE usersScores 0 99 WITHSCORES
Cette méthode est efficace et parfaitement adaptée au classement en temps réel à haute performance.
Autres commandes utiles
Voici quelques commandes Redis supplémentaires utilisées sur le site 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 (remplace l'entrée existante de
userId4) :ZADD usersScores 42 "userId4" - Supprimer un utilisateur :
ZREM usersScores "userId4"
Exemple de code Redis avec Node.js
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 avec 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> pour les connexions non sécurisées et <PORT_TLS> pour TLS. Il est recommandé d'utiliser TLS.
tls: {}, // Fournir un objet vide pour activer TLS
lazyConnect: true
});
// Connexion à 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 userId1 dans le classement
const rankPosition = await redis.zrevrank('usersScores', 'userId1');
console.log('userId1 est classé à la position ' + rankPosition);
// Déconnexion de Redis
await redis.disconnect();
})();
Ce code simple et efficace est idéal pour gérer des données de classement en temps réel.
Conclusion
Résoudre ce problème a été à la fois intéressant et stimulant. Dans notre cas, Redis s'est révélé être une solution idéale car il est facile à utiliser, puissant et extrêmement rapide.
Si vous souhaitez tester Redis, vous pouvez lancer 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 affichant les services Node.js et Redis en fonctionnement