Maison  >  Article  >  base de données  >  Utilisez Redis pour compléter le système de classement

Utilisez Redis pour compléter le système de classement

齐天大圣
齐天大圣original
2020-05-14 09:41:472030parcourir

Il existe un type de données très spécial dans Redis - un ensemble ordonné. Le concept d’ensemble que nous avons appris précédemment est que tous les éléments de l’ensemble sont uniques et non ordonnés. Mais pourquoi un ensemble ordonné apparaît-il ici, et comment réalise-t-il l’ordre ?

Les éléments de l'ensemble ordonné sont toujours uniques, mais un socre (score) est défini pour chaque élément, et l'ordre est réalisé grâce à ce score. Comme le montre la figure ci-dessous :

Utilisez Redis pour compléter le système de classement

API des ensembles ordonnés

Ce qui suit présente plusieurs API d'ensembles ordonnés , vous devez connaître l'utilisation de ces API pour implémenter la fonction de classement.

zAdd

Nous souhaitons établir une liste ordonnée des valeurs de capacité 2k des joueurs, en utilisant le nom du joueur comme élément et la capacité valeur sous forme de scores.

La capacité de tir de Curry est de 100, James a 92 ans, Harden a 96 ans, Paul a 97 ans

sadd peut ajouter 1 ou plusieurs éléments à la fois

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

Au cours du mois dernier, Harden a continué d'exploser, marquant des scores fous, alors 2k a décidé d'augmenter sa capacité de tir de 2 points

127.0.0.1:6379[1]> zincrby 2kplayer:shoot 2 harden
"98"

zRange, zRevRange

Maintenant, nous voulons savoir qui sont les 3 meilleurs joueurs.

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 utilise l'ordre positif par défaut et les scores sont triés du plus petit au plus grand. Nous devons donc utiliser 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

La valeur de capacité 2k a de nombreux aspects, le tir n'est que l'un d'entre eux, la vitesse, le lay-up, etc. . font tous partie de la valeur de la capacité.

127.0.0.1:6379[1]> zadd 2kplayer:speed 99 james 90 paul 90 curry 93 harden 
(integer) 4

À ce stade, si vous souhaitez connaître la valeur globale des capacités du joueur, vous devez additionner les scores de chaque élément

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"

Mettre en œuvre le système de classement

// 观看视频
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);
}

Mettre en œuvre le système de classement

La scène est la suivante : un système de vidéo à la demande avec de nombreuses personnes qui le regardent chaque jour. Le système dispose d'une fonction de liste qui affiche les vidéos les plus visionnées. Elle est divisée en liste d'aujourd'hui, liste de trois jours, classement hebdomadaire et liste mensuelle.

Idée : commencez par compter le nombre de vues de vidéos par jour, puis comptez la liste du jour, la liste de trois jours, etc. Le pseudocode pour compter les vues de vidéos est le suivant :

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);
}

Le plus chaud du jour

Le plus chaud du jour Il y a une chose à Remarque : lorsqu'une nouvelle journée commence, les données peuvent être vides ou très peu. Par conséquent, nous pouvons combiner les données d’aujourd’hui et d’hier, mais en accordant une pondération plus élevée aux données d’aujourd’hui. Le pseudo-code d'implémentation de fonction le plus populaire aujourd'hui est le suivant :

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);
}

Liste de trois jours

rrreeeListe hebdomadaire, liste mensuelle La liste et les autres idées sont les mêmes que la liste de trois jours, donc je ne publierai pas le code.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn