Heim  >  Artikel  >  Datenbank  >  Verwenden Sie Redis, um das Ranking-System zu vervollständigen

Verwenden Sie Redis, um das Ranking-System zu vervollständigen

齐天大圣
齐天大圣Original
2020-05-14 09:41:472035Durchsuche

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:

Verwenden Sie Redis, um das Ranking-System zu vervollständigen

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[] = &#39;video:view:&#39;.date(&#39;Y_m_d&#39;, 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn