Heim >Java >javaLernprogramm >Tutorial zur Verwendung von Redis zur Implementierung der Benutzerpunkte-Rangliste
Die Ranking-Funktion ist eine sehr häufige Forderung. Die Verwendung der Funktion „Geordnete Sammlung“ in Redis zur Implementierung von Rankings ist eine gute und schnelle Wahl.
Allgemeine Ranglisten sind wirksam, beispielsweise die „Benutzerpunkteliste“. Wenn es keine Effektivität gibt und das Ranking immer auf dem Gesamtranking basiert, stehen möglicherweise immer ein paar alte Benutzer ganz oben auf der Liste. Für neue Benutzer ist das wirklich frustrierend.
Nehmen wir zunächst eine „Liste der heutigen Punkte“. Die Sortierregel erfolgt von den meisten bis zu den wenigsten neuen Punkten, die heute von Benutzern hinzugefügt wurden.
Wenn der Benutzer dann Punkte hinzufügt, führt er oder sie eine geordnete Sammlung durch, die den Punkteanstieg an diesem Tag aufzeichnet.
Angenommen, heute ist der 1. April 2015 und der Benutzer mit UID 1 hat aufgrund eines bestimmten Vorgangs 5 Punkte erhalten.
Der Redis-Befehl lautet wie folgt:
ZINCRBY rank:20150401 5 1
Angenommen, dass mehrere andere Benutzer ebenfalls Punkte hinzugefügt haben:
ZINCRBY rank:20150401 1 2ZINCRBY rank:20150401 10 3
Sehen Sie Nun sind die Daten in der geordneten Menge rank:20150401 (der Parameter withscores kann verwendet werden, um die Punktzahl des Elements zu erhalten):
ZRANGE rank:20150401 0 -1 withscores1) „2“2) „1“3) „1 "4) "5 "5) "3"6) "10"
#p#Paging title#e#
Gemäß der Bewertung von hoch nach niedrig erhalten Sie die Top10:
ZREVRANGE rank:20150401 0 9 withscores1) „3“2) „10“3) „1“4) „5“5) „2“6) „1“
Da es nur drei Elemente gibt, wurden diese Daten abgefragt.
Wenn die Punkterangliste des Tages jeden Tag aufgezeichnet wird, sind andere Listen mit verschiedenen Tricks einfach.
Zum Beispiel „Rangliste von gestern“:
ZREVRANGE rank:20150331 0 9 withscores
Verwenden Sie Union, um die Summe der Punkte für mehrere Tage zu ermitteln und so die „Rangliste von letzter Woche“ zu erhalten:
ZUNIONSTORE rank:last_week 7 Rang:20150323 Rang:20150324 Rang:20150325 Rang:20150326 Rang:20150327 Rang:20150328 Rang:20150329 GEWICHTE 1 1 1 1 1 1 1
Auf diese Weise werden die 7-Tage-Score-Datensätze in den geordneten Set-Rang zusammengeführt :last_week. Gewichtungsfaktor WEIGHTS Wenn nicht angegeben, ist der Standardwert 1. Um die Details nicht zu verheimlichen, habe ich sie bewusst ausgeschrieben.
Dann lauten die Informationen zum Abfragen der Top 10 der Rangliste der letzten Woche:
ZREVRANGE rank:last_week 0 9 withscores#p#Paging title#e#
"Monatliches Ranking", "Vierteljährliches Ranking", "Jahresranking". " usw. Und so weiter.
Das Folgende ist eine einfache Implementierung der PHP-Version. Die Verwendung von Redis basiert auf der PHP-Erweiterung PhpRedis, und der Code ist für die Verarbeitungszeit auch auf die Carbon-Bibliothek angewiesen. Die Codemenge ist sehr gering, daher werde ich keinen Kommentar abgeben.
<?php namespace BlogRedis; use Redis; use CarbonCarbon;class Ranks { const PREFIX = 'rank:'; protected $redis = null; public function __construct(Redis $redis) { $this->redis = $redis; } public function addScores($member, $scores) { $key = self::PREFIX . date('Ymd'); return $this->redis->zIncrBy($key, $scores, $member); } protected function getOneDayRankings($date, $start, $stop) { $key = self::PREFIX . $date; return $this->redis->zRevRange($key, $start, $stop, true);