Maison >base de données >Redis >Utilisez Redis pour compléter le système de classement
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 :
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[] = 'video:view:'.date('Y_m_d', 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!