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 Commanderincluse.- 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.
Pourquoi nous avons choisi Redis
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".
Validations techniques
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 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.
Autres commandes utiles
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"
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 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.
Conclusion
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écution