千家信息网

Redis制作排行榜系统

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,今天小编就为大家带来一篇有关Redis制作排行榜系统的文章。小编觉得挺实用的,为此分享给大家做个参考。一起跟随小编过来看看吧。redis里有一种很特殊的数据类型--有序集合。之前我们学过的集合的概念是
千家信息网最后更新 2025年11月07日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安全错误 数据库的锁怎样保障安全 服务器 php 地图数据的采集和地图数据库 查看数据库中所有集合代码 黄浦区车载网络技术创新服务 服务器发生故障怎么排查和修复 军队网络安全例子 香港服务器如何做代理 智唐科技是互联网公司吗 服务器电源8pin 长春游戏软件开发公司有哪些 四川经济频道关于网络安全 保密软件开发合同范本 网络安全日常管理保密协议 网络安全之红队总结 幻想神域服务器维护 山东新能源软件开发近期价格 街头篮球怎么选服务器 等保2.0网络安全 服务器集群中交换机的搭建 软件开发工程师考试 物联网的的其他网络技术 智唐科技是互联网公司吗 微软网络安全收入 联通软件开发待遇怎么样青岛 提示无法连接服务器是怎么回事 pg数据库转字符串 如何去别的服务器玩绝地求生 网络信息安全和软件开发 延边创业软件开发有限公司地址 企业管控软件开发公司价格
0