Leaderboards

Was ist eine Leaderboard?

Leadersboards – Tabellen, die Namen, Positionen und die aktuelle Punktzahl (oder andere Daten) der führenden Mitspieler auflisten – sind aus der Welt der Computerspiele nicht mehr wegzudenken. Leadersboards werden heutzutage aber für viel mehr als nur für Spiele genutzt. Im Zuge der Gamification können sie für alle Gruppen angewandt werden, die ein gemeinsames Ziel verfolgen, wie beispielsweise Coworker, Studenten, Verkäufer, Fitnessgruppen und Freiwilligengruppen.

Durch die öffentliche Anzeige des aktuellen Rankings jedes Gruppenmitglieds können Leaderboards ein gesundes Konkurrenzdenken innerhalb einer Gruppe entstehen lassen. Sie bieten zudem einen Überblick über die aktuelle Leistung des gesamten Teams.

Leaderboards für Gamification

Die Gamification von Aufgaben und Zielen mithilfe von Leaderboards ist eine hervorragende Motivationshilfe. Durch konstantes Feedback weiß jeder, wo er aktuell im Vergleich zu anderen Gruppenmitgliedern steht. Im Idealfall führt dies zu einem gesunden Konkurrenzdenken und einer Stärkung des Gruppenzusammenhalts.

Auf dem Bild ist ein Beispiel eines einfachen Leaderboards zu sehen, das ein Unternehmen verwenden könnte, um seine Mitarbeiter zur Teilnahme an einem Gesundheitsprogramm zu motivieren.

In diesem Beispiel können die Mitarbeiter die bestplatzierten Konkurrenten und ihren aktuellen Punktestand einsehen. Außerdem sehen sie die verbleibende Zeit des Wettbewerbs und die Preise, die es zu gewinnen gibt. Wenn sich die Daten ändern (wenn die Benutzer eine überprüfte Schrittzahl hochladen), ändern sich die Rankings in Echtzeit.

Es gibt zwei Arten von Leaderboards:

Absolute Leaderboards  listen alle Wettbewerber nach einem einheitlichen globalen Maßstab auf. Typischerweise zeigen diese Leaderboards die bestplatzierten Mitglieder der Gruppe an, beispielsweise die Top 10.

Relative Leaderboards nutzen verschiedene Datenpunkte, um die Mitglieder nach engeren oder relativen Kriterien zu gruppieren und innerhalb dieser zu listen. Dafür können komplexe Berechnungen erforderlich sein, damit die Daten auf zahlreiche Weisen dargestellt werden können. Im Gaming ist es zum Beispiel oft so, dass bei einem Spieler auch die Plätze über und unter ihm angezeigt werden.

Herausforderungen von modernen Leaderboards

In unserer durchs Internet verbundenen Welt können Bestenlisten für beliebte Spiele hunderttausende oder sogar Millionen von Spielern umfassen. Gleiches gilt für weniger traditionelle Anwendungen von Scoreboards bei Fitness- und Gesundheitsanwendungen, auf Social Media oder bei internen organisatorischen Aufgaben im Kundendienst, der Logistik oder bei der Betrugsbekämpfung.

Die für Leaderboards genutzten Daten werden permanent aktualisiert und die Benutzer möchten diese Daten auf verschiedene Arten dargestellt bekommen. Deshalb sind Leaderboards ein hervorragendes Beispiel für die Anwendung von Echtzeitanalysen. An ihnen sieht man, wie schnell Ihre Daten-Ebene Lese-, Schreib-, Sortier- und anderen wichtige Vorgänge handhabt.

Technische Herausforderungen von Leaderboards wie:

  • Millionen von Benutzern
  • Mathematische Berechnungen mit einer großen Anzahl von Attributen (das Analysieren von Daten auf zahlreiche Arten, um verschiedene Ansichten der Daten zu erhalten)
  • Zugriff auf Echtzeit-Leaderboards mit hoher Verfügbarkeit
  • Benutzern ermöglichen, ihre Leaderboards-Statistiken auf Social Media zu teilen
  • Benutzern ermöglichen, Benachrichtigungen zu erhalten, wenn sich die Werte, die sie im Leaderboard interessieren, ändern
  • Anwendungen ermöglichen, Leaderboards global und genau dort, wo Änderungen geschehen, zu aktualisieren, und gleichzeitig eine globale Übersicht der Bestenliste von jedem Standort aus zu bieten

Viele Webtechnologien sind nicht in der Lage, diese Daten in Echtzeit bereitzustellen, und das System gleichzeitig aufrechtzuerhalten. Redis Enterprise meistert diese Herausforderung dank einer Vielfalt an Einsatzoptionen und dank Datenstrukturen, die genau für diese Art von Anwendungsfälle gemacht wurden.

Warum Redis Enterprise für Leaderboards?

Sorted Sets (ZSETs) sind eine in Redis enthaltene Datenstruktur, die die Erstellung und Pflege von Leaderboards vereinfacht.

Redis Enterprise basiert auf einer symmetrischen Shared-Nothing Architektur , die für ein lineares und nahtloses Wachstum von Datensatzgrößen sorgt, ohne Änderungen am Anwendungscode zu fordern.

Redis Enterprise bietet mehrere Modelle von hoher Verfügbarkeit und lässt Sie Redis geographisch verteilt einsetzen. Gleichzeitig werden lokale Latenzzeiten für Ihre Benutzer minimiert.

Mehrere Persistenzoptionen (AOF pro Schreibvorgang oder ein Snapshot nach einigen Sekunden), die die Leistung nicht beeinflussen, garantieren, dass Sie Ihre Datenbankserver nach Ausfällen nicht wieder neu aufbauen müssen.

Eine Unterstützung für extrem große Datensätze mit intelligentem, stufenweisem Zugriff auf Speicher (RAM, persistenter Speicher oder Flash) garantiert, dass Sie Ihre Datensätze skalieren können, um die Anfragen Ihrer Benutzer ohne erhebliche Beeinträchtigung der Leistung zu erfüllen.

Sorted Sets im Detail

Das Erstellen eines Sorted Set ist mit dem Redis ZADD Befehl ganz einfach. Stellen Sie sich zum Beispiel vor, eine Gruppe von Spielern zu einem Leaderboard hinzuzufügen. Jeder Spieler besteht aus einem Bildschirmnamen und dem Punktestand des Spielers, der sich über die Zeit hinweg permanent verändert

Das Hinzufügen eines Spielers zu einem Sorted Set ist sehr einfach. Sie müssen nur den ZADD-Befehl ausführen und den Set-Namen, eine Punktzahl und den Spielernamen eingeben:

ZADD players 200 Fred

Wenn das Set nicht bereits existiert, wird es von Redis erstellt. Wenn es bereits existiert, fügt Redis neue Daten zu dem bestehenden Set hinzu. Jedes Element im Sorted Set muss einmalig sein. Wenn also der Spielername (Mitglied) nicht existiert, wird er dem Set hinzugefügt. Wenn das Mitglied jedoch bereits existiert, wird sein Wert auf den neuen bereitgestellten Wert abgestimmt. Die integrierten Sorted Set-Befehle  ermöglichen eine schnelle, native Sortierung und machen das Melden von Vorgängen ganz einfach.

Zum Beispiel verändert der ZRANGE-Befehl eine Reihe von Elementen. ZRANGEBYSCORE verändert eine Reihe von Elementen, die innerhalb eines bestimmten Punktebereichs liegen. ZRANK ändert das Ranking eines bestimmten Mitglieds.

Mit dem ZINCRBY-Befehl ermöglicht Redis eine einfache Erhöhung der Punktzahl eines Spielers unter Angabe des Mitgliedernamens und des Werts, um den die Punktzahl erhöht werden soll.

Zudem können Sie mehrere Sorted Sets für Ihr Spiel/Ihre Anwendung verwalten. Zum Beispiel umfasst ein globales Sorted Set die Gesamtpunktzahl aller Turniere und mehrere Sorted Sets der einzelnen Turniere. Dann können Sie auf Redis’ einzigartige Ressourcen für die Vorgänge zwischen den Sorted Sets zurückgreifen, zum Beispiel ZUNIONSTORE für den Vereinigungsvorgang mit oder ohne Gewichte.

Diese einfachen Datenbeispiele zeigen keine grafischen Daten an, aber genau hier zeigt sich eine der Stärken des Sorted Sets von Redis: es sind reine In-Memory-Daten, die an keine bestimmte Darstellungsart geknüpft sind. Das bedeutet, dass Sie die Daten ganz nach Wunsch anzeigen können.

So erstellt man ein Leaderboard

Werfen wir einen schnellen High-Level-Blick auf die Erstellung eines Leaderboards in Node.js in einer bereits bestehenden Web-App. Mit dem Node Package Manager (NPM) kann Redis mit folgendem Befehl einfach zu Ihrer Web-App hinzugefügt werden npm install redis.

Sobald die Redis Node Packages in Ihrem Web-App-Projekt installiert sind, können Sie auf die Redis Funktion über JavaScript API zugreifen. (Die offiziellen Dokumente in the node_redis Github repository  helfen Ihnen dabei.)

Erstellen wir eine simple In-Memory-Datenbank mithilfe des Sorted Sets. Wir erstellen Mitglieder namens player:[uniqueId], wobei uniqueld ein ganzzahliger Wert ist, der ganz einfach über Ihren JavaScript- oder Python-Code generiert werden kann, wenn ein Benutzer dem Wettbewerb beitritt.

Der Punktescore kann aus jeglichen numerischen Daten bestehen, die Sie für das Ranking der Spieler benutzen möchten (tägliche Schritte in einem Gesundheitsprogramm des Unternehmens, niedergeschossene Aliens in einem Computerspiel, etc.)

Diese Basisdaten des Spielers sehen ungefähr so aus:

leaderboard-playerdata

Sehen wir uns jetzt den Node.js-Code an, den Sie für die Anzeige der Daten nutzen können.

Nutzen Sie einen Hash, um mehrere Werte zu speichern

Sie können einen Datensatz erstellen, der in verschiedene Segmente zerlegt und dargestellt werden kann. Dafür ist es hilfreich, Daten in einer Struktur zu speichern, die jeden Wettbewerber darstellt. Redis bietet eine solche Struktur namens Hash. Ein Hash kann zahlreiche Paare (Schlüssel + Wert) enthalten, die mit einem Schlüssel verbunden sind.

Sie können einen einfachen numerischen Schlüssel als einmalige Kennung in Ihrem Hash nutzen und dann diesen einmaligen Schlüssel mit einem Sorted Set verknüpfen, der die Punktzahl und den Schlüssel enthält. So können Sie schnell die Punktzahl für Ihre Top-Wettbewerber oder eine Reihe von Wettbewerbern erhalten. Wenn Sie dann mehr Daten wünschen, können Sie diese ganz einfach aus dem Hash mit dem im Sorted Set gespeicherten Schlüsselwert erhalten.

Das Erstellen eines Redis Hash ist einfach. Dieser Hash namens allPlayers verwendet folgendes Format:

hset [ einmalige ID (zum Identifizieren des Hash)] [Eigenschaft Name] [Eigenschaft Wert] ...

Erstellen Sie dann einen neuen Hash mit dem Namen eines Spielerschlüssels: 100 und fügen Sie eine screenName Eigenschaft mit dem Wert Fred hinzu. Sie könnten den Hash Schlüssel einfach als 100 belassen, aber mit dem Format [stringID:IntegerID] wird es einfacher lesbar. Wenn Sie einen anderen Spieler hinzufügen, erstellen Sie einen neuen Hash-Schlüssel, wie beispielsweise Spieler:101.

hset player:100 screenName Fred

Wenn Sie alle Eigenschaften und Werte (Name-Wert-Paare), die für einen besonderen Hash gespeichert sind, abrufen möchten, nutzen Sie einfach diesen Befehl:

hgetall player:100

Sie können sehen, dass es zu diesem Zeitpunkt genau ein Name-Wert-Paar gibt.

1) "screenName"
2) "Fred"

Der Hash ist eine flexible Struktur; es ist einfach, Eigenschaften und Werte dynamisch hinzuzufügen.

Stellen Sie sich vor, dass Sie das Datum speichern möchten, an dem sich der Spieler zuletzt eingeloggt hat:

hset player:100 lastLoggedIn 2019-07-30

Wenn Sie jetzt hgetall erneut aufrufen, sehen Sie:

1) "screenName"
2) "Fred"
3) "lastLoggedIn"
4) "2019-07-30"

Sie müssen einfach jeden Spieler zu Ihrem allPlayers Hash mit seiner eigenen einmaligen ID hinzuzufügen.  Dann können Sie diese mit einem Sorted Set verbinden, das die Punktzahl jeden Spieler enthält.

Hier ist ein Überblick, der zeigt, wie Sie Ihre Daten verknüpfen können:

leaderboard-datachart

Wenn Sie die Hashes (player:NNN) hinzufügen, erhalten Sie Ihre Liste und können die Spielerdatenschlüssel nutzen, wenn Sie dem Sorted Set Daten hinzufügen. So nutzen Sie die Leistungsstärke der Redis In-Memory-Datenbank: Sie können mit riesigen Datensätzen (Millionen von Spielern!) arbeiten und die Rankings jedes Spielers nachverfolgen, und das mit einer unglaublichen Geschwindigkeit.

Jetzt können Sie ganz einfach eine Lösung implementieren, die die Daten mithilfe von Node und des node_redis-Packages abruft, sodass Sie die Bestenliste auf Ihrer Web-App stets auf dem neuesten Stand halten können. Das funktioniert ganz einfach dank des node_redis Packages API, mit dem ein Sorted Set nach Name (playerRank) abgerufen werden kann.

Mit Redis Enterprise halten Sie Ihre Bestenlisten auf dem neuesten Stand und bringen Ihre Benutzer dazu, immer wieder zu Ihnen zurückkehren, um ihre Rankings einzusehen.


Nächste Schritte