Redis®*: Classificare gli utenti in tempo reale
Scopri come classificare 2 milioni di utenti per punteggio in tempo reale utilizzando Redis
👋 Benvenuti nella documentazione di Stackhero!
Stackhero offre una soluzione Redis cloud pronta all'uso che fornisce numerosi vantaggi, tra cui:
- Interfaccia web
Redis Commanderinclusa.- Dimensione e trasferimenti di messaggi illimitati.
- Aggiornamenti senza sforzo con un solo clic.
- Prestazioni ottimali e sicurezza robusta grazie a una VM privata e dedicata.
Risparmia tempo e semplifica la tua vita: bastano solo 5 minuti per provare la soluzione di hosting Redis cloud di Stackhero!
Uno dei nostri clienti ci ha contattato con una sfida interessante. Gestisce un sito web sportivo dove gli utenti guadagnano punti quando vincono scommesse o completano varie azioni.
Il suo obiettivo era mostrare la classifica di ogni utente, visualizzare gli utenti immediatamente sopra e sotto di loro, e generare una classifica dei primi 100. Con una comunità di 2 milioni di utenti, i dati dovevano essere elaborati in tempo reale!
In Stackhero amiamo affrontare sfide come questa. In questo articolo, vi guideremo attraverso la nostra soluzione passo dopo passo.
Perché abbiamo scelto Redis
I database tradizionali come MySQL, PostgreSQL o Elasticsearch non sono progettati per compiti di classificazione a bassa latenza. Questo ci ha spinti a esplorare un'altra opzione.
Abbiamo scelto Redis, un database in-memory estremamente veloce e affidabile. Secondo DB-Engines, è il 7° database più utilizzato al mondo e l'opzione leader nella categoria "Key-value store".
Redis offre diversi modelli di dati. Per questo scenario, uno si distingue: i "sorted sets".
Validazioni tecniche
I sorted sets combinano una chiave e un punteggio. Nel nostro caso, la chiave è l'ID utente e il punteggio rappresenta i punti dell'utente.
Abbiamo iniziato lanciando un servizio Redis su Stackhero. Il servizio è attivo in soli 2 minuti con l'ultima versione stabile, offre fatturazione oraria e dispone di Redis Commander, una pratica interfaccia web. Abbiamo validato il concetto utilizzando questa interfaccia.
Abbiamo aggiunto tre utenti con ID e punteggi di esempio come mostrato di seguito:
| Nome utente | Punteggio | | - | - | | userId1 | 11 | | userId2 | 54 | | userId3 | 24 |
Questi utenti sono stati aggiunti a un sorted set chiamato usersScores utilizzando i seguenti comandi Redis:
ZADD usersScores 11 "userId1"
ZADD usersScores 54 "userId2"
ZADD usersScores 24 "userId3"
Redis Commander, l'interfaccia web fornita su Stackhero con le istanze Redis
Successivamente, abbiamo recuperato il punteggio di userId1:
ZSCORE usersScores "userId1"
> 11
Questo ha confermato che il punteggio per userId1 era effettivamente 11. Dopo di ciò, abbiamo verificato il rango di userId1:
ZREVRANK usersScores "userId1"
> 2
Ricordate, la classifica inizia da 0. Questo significa che le classifiche sono le seguenti:
| Nome utente | Punteggio | Rango | | - | - | - | | userId1 | 11 | 2 | | userId2 | 54 | 0 | | userId3 | 24 | 1 |
Il comando ZREVRANK ha restituito 2, che è esattamente ciò che ci aspettavamo per userId1.
È possibile anche recuperare le voci migliori. Ad esempio, per recuperare i primi 2 utenti (dal rango 0 al rango 1) eseguite:
ZREVRANGE usersScores 0 1 WITHSCORES
> 1) userId2
> 2) 54
> 3) userId3
> 4) 24
Per ottenere i primi 100 utenti basta eseguire:
ZREVRANGE usersScores 0 99 WITHSCORES
Questo approccio è efficiente e perfettamente adatto alla classificazione in tempo reale ad alte prestazioni.
Altri comandi utili
Di seguito sono riportati alcuni comandi Redis aggiuntivi utilizzati sul sito web del nostro cliente:
- Ottenere gli utenti classificati tra le posizioni 50 e 100:
ZREVRANGE usersScores 50 100 WITHSCORES - Aggiungere un utente:
ZADD usersScores 40 "userId4" - Aggiornare il punteggio di un utente (questo sostituisce la voce esistente
userId4):ZADD usersScores 42 "userId4" - Rimuovere un utente:
ZREM usersScores "userId4"
Esempio di codice Redis con Node.js
Dopo aver validato il concetto in Redis Commander, è il momento di integrare Redis nel codice reale. Il nostro cliente utilizza Node.js e di seguito è riportato un esempio utilizzando ioredis come client:
const Redis = require('ioredis');
(async () => {
// Impostare le credenziali Redis
// Se usate Stackhero, le troverete sulla dashboard di Stackhero
const redis = new Redis({
host: '<redisServerHost>',
password: '<redisServerPassword>',
port: <PORT_TLS>, // <PORT_CLEAR> è per connessioni non sicure e <PORT_TLS> è per TLS. TLS dovrebbe essere utilizzato.
tls: {}, // Fornire un oggetto vuoto per attivare TLS
lazyConnect: true
});
// Connettersi a Redis
await redis.connect();
// Aggiungere utenti
await redis.zadd('usersScores', 11, 'userId1');
await redis.zadd('usersScores', 54, 'userId2');
await redis.zadd('usersScores', 24, 'userId3');
// Recuperare il punteggio di userId1
const score = await redis.zscore('usersScores', 'userId1');
console.log('userId1 ha ' + score + ' punti');
// Recuperare la posizione di classifica di userId1
const rankPosition = await redis.zrevrank('usersScores', 'userId1');
console.log('userId1 è classificato alla posizione ' + rankPosition);
// Disconnettersi da Redis
await redis.disconnect();
})();
Questo semplice ma potente frammento di codice è ideale per gestire i dati di classificazione in tempo reale.
Conclusione
Affrontare questo problema è stato sia interessante che stimolante. Nel nostro caso, Redis si è rivelato una soluzione ideale perché è facile da usare, potente ed eccezionalmente veloce.
Se desiderate sperimentare con Redis, potete avviare un'istanza su Stackhero in soli 2 minuti. Godetevi l'ultima versione stabile, un'interfaccia web, backup e prestazioni impressionanti a portata di mano.
Dashboard Stackhero che mostra i servizi Node.js e Redis in esecuzione