千家信息网

Redis制作排行榜系统

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,今天小编就为大家带来一篇有关Redis制作排行榜系统的文章。小编觉得挺实用的,为此分享给大家做个参考。一起跟随小编过来看看吧。redis里有一种很特殊的数据类型--有序集合。之前我们学过的集合的概念是
千家信息网最后更新 2026年11月01日Redis制作排行榜系统

今天小编就为大家带来一篇有关Redis制作排行榜系统的文章。小编觉得挺实用的,为此分享给大家做个参考。一起跟随小编过来看看吧。

redis里有一种很特殊的数据类型--有序集合。之前我们学过的集合的概念是,集合里所有元素都是唯一的、无序的。但这里怎么出现了有序集合,他是怎么来实现有序的呢?

有序集合里元素还是唯一的,但会给每个元素设置一个socre(分值),通过这个分值来实现有序的。如下图所示:

有序集合API

下面介绍几个有序集合的API,实现排行榜功能需要知道这些API的用法。

zAdd

我们想设置一个球员2k能力值的有序列表,使用球员名为元素,能力值为scores。

库里的投射能力为100,詹姆斯为92,哈登为96,保罗为97

sadd一次可以添加1个或多个元素

127.0.0.1:6379[1]> zadd 2kplayer:shoot 100 curry(integer) 1127.0.0.1:6379[1]> zadd 2kplayer:shoot 92 james 96 harden 97 paul(integer) 3

zIncrBy

这一个月来,哈登连续爆种,疯狂连续砍高分,那么,2k决定将他的投射能力值提高2点

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

zRange、zRevRange

现在我们想知道能力值前3名的球员是哪3个。

127.0.0.1:6379[1]> zrange 2kplayer:shoot 0 2 withscores1) "james"2) "92"3) "paul"4) "97"5) "harden"6) "98"

redis默认采用正序,分值从小到大排序。所以我们需要使用zRevRange

127.0.0.1:6379[1]> zrevrange 2kplayer:shoot 0 2 withscores1) "curry"2) "100"3) "harden"4) "98"5) "paul"6) "97"

zUnionStore

2k能力值是有多方面的,投射只是其中一项,速度、上篮等都是能力值的一部分。

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

这时候,想知道球员综合能力值的话,就需要将每一项的得分都加起来

127.0.0.1:6379[1]> zunionstore 2kplayer 2 2kplayer:shoot 2kplayer:speed(integer) 4127.0.0.1:6379[1]> zrange 2kplayer 0 -1 withscores1) "paul"2) "187"3) "curry"4) "190"5) "harden"6) "191"7) "james"8) "191"

实现排行榜系统

场景如下:一个视频点播系统,每天观看的人很多。该系统有个榜单功能,展示观看量最多的视频。分为今日榜单、三日榜单、一周排行、月榜单。

思路:首先是按天统计视频观看次数,然后再统计出今日榜单、三日榜单等。

统计视频观看次数的伪代码如下:

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

今日最热

今日最热有一个注意点,当新的一天刚开始时,数据可能为空或很少。所以,我们可以将今日和昨日的数据合并起来,但将今日的数据权重设高些。

今日最热功能实现伪代码如下:

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

三日榜单

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

周榜单、月榜单等和三日榜单的思路完成一样,所以就不贴出代码了。

关于Redis制作排行榜系统就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果喜欢这篇文章,不如把它分享出去让更多的人看到。

有序 能力 系统 元素 视频 排行榜 数据 球员 代码 分值 统计 制作 功能 思路 更多 次数 哈登 实用 特殊 疯狂 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 河南真二互联网科技有限公司 互联网科技与金融科技 互联网络科技有限公司 上海互联网科技有限公司 互联网科技网站 长亮科技 互联网金融 多迪互联网科技有限公司 甘肃拓世互联网科技有限公司 滨湖区互联网智能科技产品供应 青海省互联网新科技 汉立互联网科技有限公司联系电话 互联网科技产品 济南华为互联网科技产业总部基地 互联网教育科技公司vipkid 昭通云南众福互联网科技有限公司 互联网金融中的现代科技 昊天互联网科技有限公司 湖南一路畅行互联网科技 扫呗互联网科技有限公司 玉溪新华互联网科技怎么选 互联网科技工作委员会副主任毛军 亿策互联网科技 新浪科技互联网 互联网科技类展会 互联网 科技馆 允成互联网科技有限公司融资 四川慕妮娅互联网科技有限公司 互联网数据科技专业 广州千川互联网科技有限公司 中国主要互联网科技公司
0