Es gibt einen ganz besonderen Datentyp in Redis – geordnete Menge. Das Konzept einer Menge, das wir zuvor gelernt haben, besteht darin, dass alle Elemente in der Menge einzigartig und ungeordnet sind. Aber wie kommt es, dass hier eine geordnete Menge erscheint, und wie wird damit eine Ordnung erreicht?
Die Elemente im geordneten Satz sind immer noch eindeutig, aber für jedes Element wird ein Socre (Score) festgelegt, und die Reihenfolge wird durch diesen Score erreicht. Wie in der Abbildung unten gezeigt:
Ordered Set API
Im Folgenden werden mehrere APIs für geordnete Sätze vorgestellt , müssen Sie die Verwendung dieser APIs kennen, um die Ranking-Funktion zu implementieren.
zAdd
Wir möchten eine geordnete Liste der 2k-Fähigkeitswerte der Spieler erstellen und dabei den Spielernamen als Element und die Fähigkeit verwenden Wert als Punkte.
Currys Schussfähigkeit ist 100, James ist 92, Harden ist 96, Paul ist 97
sadd kann ein oder mehrere Elemente gleichzeitig hinzufügen
127.0.0.1:6379[1]> zadd 2kplayer:shoot 100 curry (integer) 1 127.0.0.1:6379[1]> zadd 2kplayer:shoot 92 james 96 harden 97 paul (integer) 3
zIncrBy
Im letzten Monat ist Harden weiter explodiert und hat verrückte Highscores erzielt, also hat 2k beschlossen, seine Schussfähigkeiten um 2 Punkte zu erhöhen
127.0.0.1:6379[1]> zincrby 2kplayer:shoot 2 harden "98"
zRange, zRevRange
Jetzt wollen wir wissen, wer die Top 3 Spieler sind.
127.0.0.1:6379[1]> zrange 2kplayer:shoot 0 2 withscores 1) "james" 2) "92" 3) "paul" 4) "97" 5) "harden" 6) "98"
Redis verwendet standardmäßig eine positive Reihenfolge und die Ergebnisse werden von klein nach groß sortiert. Wir müssen also zRevRange
127.0.0.1:6379[1]> zrevrange 2kplayer:shoot 0 2 withscores 1) "curry" 2) "100" 3) "harden" 4) "98" 5) "paul" 6) "97"
zUnionStore
2k-Fähigkeitswert verwenden, der viele Aspekte hat, das Schießen ist nur einer davon, Geschwindigkeit, Layup usw .sind alle Teil des Fähigkeitswertes.
127.0.0.1:6379[1]> zadd 2kplayer:speed 99 james 90 paul 90 curry 93 harden (integer) 4
Wenn Sie zu diesem Zeitpunkt den umfassenden Fähigkeitswert des Spielers wissen möchten, müssen Sie die Punkte jedes Gegenstands addieren
127.0.0.1:6379[1]> zunionstore 2kplayer 2 2kplayer:shoot 2kplayer:speed (integer) 4 127.0.0.1:6379[1]> zrange 2kplayer 0 -1 withscores 1) "paul" 2) "187" 3) "curry" 4) "190" 5) "harden" 6) "191" 7) "james" 8) "191"
Das Rangsystem implementieren
Die Szene ist wie folgt: ein Video-on-Demand-System, das viele Leute jeden Tag ansehen. Das System verfügt über eine Listenfunktion, die die am häufigsten angesehenen Videos anzeigt. Sie ist in die heutige Liste, die dreitägige Liste, die wöchentliche Rangliste und die monatliche Liste unterteilt.
Idee: Zählen Sie zunächst die Anzahl der Videoaufrufe pro Tag und dann die heutige Liste, die dreitägige Liste usw.
Der Pseudocode zum Zählen von Videoaufrufen lautet wie folgt:
// 观看视频 function view ($videoId) { $key = 'video:view:'.date('Y-m-d'); if (!$redis->exists($key)) { $redis->zIncrBy($key, 1, $videoId); $redis->expire($key, 86400 * 30); } $redis->zIncrBy($key, 1, $videoId); }
Today's hottest
Today's hottest Da ist eines zu tun Beachten Sie, dass zu Beginn eines neuen Tages die Daten möglicherweise leer oder sehr wenig sind. Daher können wir die Daten von heute und gestern kombinieren, die Daten von heute jedoch höher gewichten.
Der heute beliebteste Funktionsimplementierungs-Pseudocode lautet wie folgt:
function todayHot () { $tokeyKey = 'video:view:'.date('Y_m_d'); $yesKey = 'video:view:'. date('Y_m_d', time() - 86400); $keyUnion = "view:rank:today"; $redis->zUnionStore($keyUnion, [$tokeyKey, $yesKey], [10, 1]); // 取前100名 return $redis->zRevRange($keyUnion, 0, 99); }
Drei-Tage-Liste
function threeHot () { $keyUnion = 'view:rank:three'; $unionKeys = []; for ($i=0; $i < 3; $i++) { $unionKeys[] = 'video:view:'.date('Y_m_d', time() - 86400 *$i); } $redis->zUnionStore($keyUnion, $unionKeys); return $redis->zRevRange($keyUnion, 0, 99, true); }
Wochenliste, Monatsliste Die Liste und andere Ideen sind die gleichen wie bei der Drei-Tages-Liste, daher werde ich den Code nicht veröffentlichen.
Das obige ist der detaillierte Inhalt vonVerwenden Sie Redis, um das Ranking-System zu vervollständigen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!