Redis®*: Benutzer in Echtzeit einstufen

Erfahren Sie, wie Sie 2 Millionen Benutzer in Echtzeit nach Punkten mit Redis einstufen können

👋 Willkommen in der Stackhero-Dokumentation!

Stackhero bietet eine einsatzbereite Redis Cloud Lösung mit zahlreichen Vorteilen, darunter:

  • Redis Commander Web-UI inklusive.
  • Unbegrenzte Nachrichtengröße und Übertragungen.
  • Mühelose Updates mit nur einem Klick.
  • Optimale Performance und robuste Sicherheit durch eine private und dedizierte VM.

Sparen Sie Zeit und vereinfachen Sie Ihr Leben: Es dauert nur 5 Minuten, um die Redis Cloud Hosting Lösung von Stackhero auszuprobieren!

Einer unserer Kunden hat uns mit einer interessanten Herausforderung kontaktiert. Er betreibt eine Sport-Website, auf der Benutzer Punkte sammeln, wenn sie Wetten gewinnen oder verschiedene Aktionen abschließen.

Sein Ziel war es, den Rang jedes Benutzers anzuzeigen, die Benutzer direkt über und unter ihnen zu zeigen und eine Top-100-Rangliste zu erstellen. Mit einer Community von 2 Millionen Benutzern mussten die Daten in Echtzeit verarbeitet werden!

Bei Stackhero lieben wir es, solche Herausforderungen anzugehen. In diesem Artikel führen wir Sie Schritt für Schritt durch unsere Lösung.

Traditionelle Datenbanken wie MySQL, PostgreSQL oder Elasticsearch sind nicht für Ranking-Aufgaben mit niedriger Latenz ausgelegt. Dies veranlasste uns, eine andere Option zu erkunden.

Wir haben Redis ausgewählt, eine In-Memory-Datenbank, die extrem schnell und zuverlässig ist. Laut DB-Engines ist es die siebtmeistgenutzte Datenbank weltweit und die führende Option in der Kategorie "Key-value store".

Redis bietet mehrere Datenmodelle. Für dieses Szenario sticht eines hervor: die "sorted sets".

Sorted sets kombinieren einen Schlüssel und einen Score. In unserem Fall ist der Schlüssel die Benutzer-ID und der Score repräsentiert die Punkte des Benutzers.

Wir begannen mit dem Start eines Redis-Dienstes auf Stackhero. Der Dienst ist in nur 2 Minuten mit der neuesten stabilen Version einsatzbereit, bietet stündliche Abrechnung und verfügt über Redis Commander, eine praktische Web-GUI. Wir haben das Konzept mit dieser Schnittstelle validiert.

Wir haben drei Benutzer mit Beispiel-IDs und -Scores wie unten gezeigt hinzugefügt:

| Benutzername | Score | | - | - | | userId1 | 11 | | userId2 | 54 | | userId3 | 24 |

Diese Benutzer wurden mit den folgenden Redis-Befehlen zu einem sorted set namens usersScores hinzugefügt:

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

Redis Commander, die Web-GUI, die auf Stackhero mit Redis-Instanzen bereitgestellt wirdRedis Commander, die Web-GUI, die auf Stackhero mit Redis-Instanzen bereitgestellt wird

Als nächstes haben wir den Score von userId1 abgerufen:

ZSCORE usersScores "userId1"
> 11

Dies bestätigte, dass der Score für userId1 tatsächlich 11 war. Danach überprüften wir den Rang von userId1:

ZREVRANK usersScores "userId1"
> 2

Denken Sie daran, dass das Ranking bei 0 beginnt. Das bedeutet, dass die Ranglisten wie folgt sind:

| Benutzername | Score | Rang | | - | - | - | | userId1 | 11 | 2 | | userId2 | 54 | 0 | | userId3 | 24 | 1 |

Der Befehl ZREVRANK gab 2 zurück, was genau das war, was wir für userId1 erwartet hatten.

Sie können auch die Top-Einträge abrufen. Um beispielsweise die ersten 2 Benutzer (von Rang 0 bis Rang 1) abzurufen, führen Sie aus:

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

Um die Top 100 Benutzer zu erhalten, führen Sie einfach aus:

ZREVRANGE usersScores 0 99 WITHSCORES

Dieser Ansatz ist effizient und perfekt für leistungsstarkes Echtzeit-Ranking geeignet.

Nachfolgend finden Sie einige zusätzliche Redis-Befehle, die auf der Website unseres Kunden verwendet werden:

  • Benutzer zwischen den Positionen 50 und 100 abrufen: ZREVRANGE usersScores 50 100 WITHSCORES
  • Einen Benutzer hinzufügen: ZADD usersScores 40 "userId4"
  • Den Score eines Benutzers aktualisieren (dies ersetzt den bestehenden userId4-Eintrag): ZADD usersScores 42 "userId4"
  • Einen Benutzer entfernen: ZREM usersScores "userId4"

Nach der Validierung des Konzepts in Redis Commander ist es an der Zeit, Redis in realen Code zu integrieren. Unser Kunde verwendet Node.js und unten ist ein Beispiel mit ioredis als Client:

const Redis = require('ioredis');

(async () => {
  // Redis-Anmeldedaten festlegen
  // Wenn Sie Stackhero verwenden, finden Sie diese im Stackhero-Dashboard
  const redis = new Redis({
    host: '<redisServerHost>',
    password: '<redisServerPassword>',
    port: <PORT_TLS>, // <PORT_CLEAR> ist für unverschlüsselte Verbindungen und <PORT_TLS> ist für TLS. TLS sollte verwendet werden.
    tls: {}, // Ein leeres Objekt bereitstellen, um TLS zu aktivieren
    lazyConnect: true
  });

  // Verbindung zu Redis herstellen
  await redis.connect();

  // Benutzer hinzufügen
  await redis.zadd('usersScores', 11, 'userId1');
  await redis.zadd('usersScores', 54, 'userId2');
  await redis.zadd('usersScores', 24, 'userId3');

  // Score von userId1 abrufen
  const score = await redis.zscore('usersScores', 'userId1');
  console.log('userId1 hat ' + score + ' Punkte');

  // Rangposition von userId1 abrufen
  const rankPosition = await redis.zrevrank('usersScores', 'userId1');
  console.log('userId1 ist auf Position ' + rankPosition + ' eingestuft');

  // Verbindung zu Redis trennen
  await redis.disconnect();
})();

Dieses einfache, aber leistungsstarke Code-Snippet ist ideal für die Verwaltung von Echtzeit-Ranking-Daten.

Diese Herausforderung anzugehen war sowohl interessant als auch herausfordernd. In unserem Fall erwies sich Redis als ideale Lösung, da es einfach zu bedienen, leistungsstark und außergewöhnlich schnell ist.

Wenn Sie mit Redis experimentieren möchten, können Sie in nur 2 Minuten eine Instanz auf Stackhero starten. Genießen Sie die neueste stabile Version, eine Web-GUI, Backups und beeindruckende Leistung direkt zur Hand.

Stackhero-Dashboard zeigt laufende Node.js- und Redis-DiensteStackhero-Dashboard zeigt laufende Node.js- und Redis-Dienste