使用Redis完成排行榜系统


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

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

QQ截图20200514082750.png

有序集合API

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

zAdd

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

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

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

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

这一个月来,哈登连续爆种,疯狂连续砍高分,那么,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 withscores
1) "james"
2) "92"
3) "paul"
4) "97"
5) "harden"
6) "98"

redis默认采用正序,分值从小到大排序。所以我们需要使用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

海科智能企业建站系统棕色风格4.3 海科智能企业建站系统棕色风格4.3

海科智能企业建站系统采用asp+access进行开发,软件支持一键生*站html静态页面,软件包含完整的前后台程序,可直接进行使用。

海科智能企业建站系统棕色风格4.3 0 查看详情 海科智能企业建站系统棕色风格4.3

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) 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"

实现排行榜系统

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

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

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

// 观看视频
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完成排行榜系统的详细内容,更多请关注其它相关文章!


# 榜单  # 今日  # Redis  # 如何实现  # 嘉兴短视频seo优化  # 斗鱼怎么实现推广营销的  # 德化县网站建设的公司  # 松岗哪些网站优化  # 网络带宽  # 来实现  # 想知道  # 分值  # 最热  # 三日  # 建站系统  # 银川网站设计建设  # seo培训推荐引流  # 新能源网站优化哪个好点  # 集团网站建设好吗  # 海南建设官方网站  # 爱站网seo电脑 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: MySQL多重JOIN技巧:高效关联同一表获取多角色信息  三星A55应用闪退排查步骤_Samsung A55稳定性优化技巧  J*aScript对象中深度嵌套URL键的查找与更新策略  windows server2019显卡驱动怎么安装_winserver2019显卡驱动安装与远程桌面优化  使用逻辑应用(Logic Apps)自动处理邮件附件中的XML到Excel  深入理解随机递归函数的确定性:内部节点、叶节点与时间复杂度分析  优化Asyncio嵌套函数调度:使用生产者-消费者模式实现并发流处理  奥克斯空调不制热啥毛病_奥克斯空调不制热原因分析及解决技巧  汽水音乐官网网页版入口 汽水音乐官网网页版在线入口  Dash应用多值文本输入处理与类型转换教程  QQ邮箱手机版网页版 QQ邮箱登录入口地址  支付宝网页版在线入口 支付宝官网电脑登录入口  C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧  抖音如何进行蓝V认证 抖音企业号申请所需资料与流程  悟空浏览器网页版链接 悟空浏览器网页版最新有效地址  C++ virtual析构函数作用_C++基类虚析构函数防止内存泄漏  英雄联盟争者留名活动介绍  海棠阅读登录教程_详细讲解海棠登录操作  《饿了么》拼好饭点外卖教程2025  使用 .htaccess 正确配置 WordPress 子目录重定向与路径保留  Bootstrap 5导航栏折叠功能失效:数据属性迁移指南  解决Go encoding/json 将JSON大数字解析为浮点数的问题  J*a中为什么强调组合优于继承_组合模式带来的灵活性与可维护性解析  阿里旺旺电脑网页版入口 阿里旺旺电脑版网页登录入口  J*aScript:从子元素中批量移除特定CSS类  iPhone16Plus参数配置如何调整声音_iPhone16Plus参数配置声音调整详细方法  优化长HTML属性值:SonarQube警告与实用策略  哔哩哔哩黑名单怎么查看  iSpring三分屏制作教程  《植物大战僵尸3》火龙草作用介绍  word页码灰色不能用如何解决  《猎聘》筛选猎头岗位方法  谷歌浏览器如何查找和删除恶意软件 谷歌浏览器内置安全清理工具使用教程  教育查询官方网站入口 教育个人档案查询免费官网  基于 Flink 和 Kafka 实现高效流处理:连续查询与时间窗口  Chart.js 教程:自定义插件实现图表与图例间距调整  不吃碳水化合物是健康减肥的好办法吗  苹果电脑如何快速截图并编辑 苹果电脑截屏标注快捷操作  修复UI元素交互障碍:从“开始”按钮到信息框的平滑过渡实现  J*aScript与CSS动画:实现平滑顺序淡入淡出效果并解决显示冲突  yy漫画登录页面官方入口_yy漫画在线阅读网址入口  智云Q3和Q2有什么升级_智云Q3与Q2手持云台功能与性能对比分析  汽水音乐网页端访问 汽水音乐官方网页直达  Python模块化编程:避免循环导入与共享函数的最佳实践  如何在Podman容器中运行Composer_Docker替代品Podman的PHP与Composer容器化实践  QQ阅读小说搜索入口地址_QQ阅读小说搜索入口地址搜索在线阅读  网页版网易云音乐入口_网易云音乐在线官网登录  Highcharts雷达图径向轴数值标签实现教程  c++如何使用std::thread::join和detach_c++线程生命周期管理  《跳跳舞蹈》循环播放方法 

 2020-05-14

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.