Redis®*: Rangschik gebruikers in real-time
Leer hoe u 2 miljoen gebruikers per score in real-time kunt rangschikken met Redis
👋 Welkom bij de Stackhero-documentatie!
Stackhero biedt een kant-en-klare Redis cloud oplossing die tal van voordelen biedt, waaronder:
Redis Commanderweb UI inbegrepen.- Onbeperkte berichtgrootte en overdrachten.
- Moeiteloze updates met slechts één klik.
- Optimale prestaties en robuuste beveiliging aangedreven door een privé en dedicated VM.
Bespaar tijd en vereenvoudig uw leven: het kost slechts 5 minuten om de Redis cloud hosting oplossing van Stackhero te proberen!
Een van onze klanten kwam met een interessante uitdaging. Hij beheert een sportwebsite waar gebruikers punten verdienen wanneer ze weddenschappen winnen of verschillende acties voltooien.
Zijn doel was om de rang van elke gebruiker weer te geven, de gebruikers direct boven en onder hen te tonen, en een top-100 ranglijst te genereren. Met een gemeenschap van 2 miljoen gebruikers moesten de gegevens in real-time worden verwerkt!
Bij Stackhero houden we ervan om uitdagingen zoals deze aan te gaan. In dit artikel nemen we u stap voor stap mee door onze oplossing.
Waarom we voor Redis kozen
Traditionele databases zoals MySQL, PostgreSQL, of Elasticsearch zijn niet ontworpen voor rangschikkingstaken met lage latentie. Dit bracht ons ertoe om een andere optie te verkennen.
We kozen voor Redis, een in-memory database die extreem snel en betrouwbaar is. Volgens DB-Engines is het de 7e meest gebruikte database ter wereld en de leidende optie in de categorie "Key-value store".
Redis biedt meerdere datamodellen. Voor dit scenario springt er één uit: de "sorted sets".
Technische validaties
Sorted sets combineren een sleutel en een score. In ons geval is de sleutel de gebruikers-ID en de score vertegenwoordigt de punten van de gebruiker.
We begonnen met het lanceren van een Redis-service op Stackhero. De service is binnen slechts 2 minuten operationeel met de nieuwste stabiele release, biedt uurbasisfacturering en beschikt over Redis Commander, een handige web-GUI. We valideerden het concept met behulp van deze interface.
We voegden drie gebruikers toe met voorbeeld-ID's en scores zoals hieronder weergegeven:
| Gebruikersnaam | Score | | - | - | | userId1 | 11 | | userId2 | 54 | | userId3 | 24 |
Deze gebruikers werden toegevoegd aan een sorted set genaamd usersScores met behulp van de volgende Redis-commando's:
ZADD usersScores 11 "userId1"
ZADD usersScores 54 "userId2"
ZADD usersScores 24 "userId3"
Redis Commander, de web-GUI geleverd op Stackhero met Redis-instanties
Vervolgens haalden we de score van userId1 op:
ZSCORE usersScores "userId1"
> 11
Dit bevestigde dat de score voor userId1 inderdaad 11 was. Daarna controleerden we de rang van userId1:
ZREVRANK usersScores "userId1"
> 2
Onthoud, rangschikking begint bij 0. Dit betekent dat de rangschikkingen als volgt zijn:
| Gebruikersnaam | Score | Rang | | - | - | - | | userId1 | 11 | 2 | | userId2 | 54 | 0 | | userId3 | 24 | 1 |
Het commando ZREVRANK gaf 2 terug, wat precies was wat we verwachtten voor userId1.
U kunt ook de beste inzendingen ophalen. Om bijvoorbeeld de eerste 2 gebruikers (van rang 0 tot rang 1) op te halen, voert u uit:
ZREVRANGE usersScores 0 1 WITHSCORES
> 1) userId2
> 2) 54
> 3) userId3
> 4) 24
Om de top 100 gebruikers te krijgen, voert u eenvoudig uit:
ZREVRANGE usersScores 0 99 WITHSCORES
Deze aanpak is efficiënt en perfect geschikt voor high-performance real-time rangschikking.
Andere nuttige commando's
Hieronder staan enkele aanvullende Redis-commando's die op de website van onze klant worden gebruikt:
- Haal gebruikers op die tussen positie 50 en 100 zijn gerangschikt:
ZREVRANGE usersScores 50 100 WITHSCORES - Voeg een gebruiker toe:
ZADD usersScores 40 "userId4" - Werk de score van een gebruiker bij (dit vervangt de bestaande
userId4-vermelding):ZADD usersScores 42 "userId4" - Verwijder een gebruiker:
ZREM usersScores "userId4"
Redis-codevoorbeeld met Node.js
Na het valideren van het concept in Redis Commander is het tijd om Redis in echte code te integreren. Onze klant gebruikt Node.js en hieronder is een voorbeeld met ioredis als client:
const Redis = require('ioredis');
(async () => {
// Stel Redis-gegevens in
// Als u Stackhero gebruikt, vindt u deze op het Stackhero-dashboard
const redis = new Redis({
host: '<redisServerHost>',
password: '<redisServerPassword>',
port: <PORT_TLS>, // <PORT_CLEAR> is voor niet-versleutelde verbindingen en <PORT_TLS> is voor TLS. TLS moet worden gebruikt.
tls: {}, // Geef een leeg object om TLS te activeren
lazyConnect: true
});
// Maak verbinding met Redis
await redis.connect();
// Voeg gebruikers toe
await redis.zadd('usersScores', 11, 'userId1');
await redis.zadd('usersScores', 54, 'userId2');
await redis.zadd('usersScores', 24, 'userId3');
// Haal de score van userId1 op
const score = await redis.zscore('usersScores', 'userId1');
console.log('userId1 heeft ' + score + ' punten');
// Haal de rangpositie van userId1 op
const rankPosition = await redis.zrevrank('usersScores', 'userId1');
console.log('userId1 staat op positie ' + rankPosition);
// Verbreek de verbinding met Redis
await redis.disconnect();
})();
Dit eenvoudige maar krachtige codefragment is ideaal voor het beheren van real-time rangschikkingsgegevens.
Conclusie
Het aanpakken van dit probleem was zowel interessant als uitdagend. In ons geval bleek Redis een ideale oplossing te zijn omdat het gemakkelijk te gebruiken, krachtig en uitzonderlijk snel is.
Als u wilt experimenteren met Redis, kunt u binnen slechts 2 minuten een instantie starten op Stackhero. Geniet van de nieuwste stabiele versie, een web-GUI, back-ups en indrukwekkende prestaties binnen handbereik.
Stackhero-dashboard met Node.js en Redis-services in uitvoering