【面试题】微博、百度等大厂的排行榜如何实现?
背景
现如今每个互联网平台都会提供一个排行版的功能,供人们预览最新最有热度的一些消息,比如百度:

再比如微博:

我们要知道,这些互联网平台每天产生的数据是非常大,如果我们使用MySQL的话,db实现小时、天、周、月的排行榜,难度及其大,而且表结构的设计也非常难,再者db也打不住这么大的并发量。

技术方案
所以高并发实时的排行榜天然适合用redis来实现。

那我们该用什么数结构呢?
正好,redis中有一个zset数据结构,刚好可以用来排序,下面说一下整体思路:
整体的技术实现是采用redis的zset来实现,每条微博是一个member,每条微博的热度值为一个score。
这里的score就和好评判了,每个平台有自己的阶段规则,比如给点赞、评论、转发,分别给出不同的评分权重,根据用户的行为来给这些一条数据加上不同的分数,然后排序。
好的,解决了数据选型以后,还需要思考:那如何把小时、天、周、月的数据,实时计算呢?
我们可能把所有数据放在一个Key里边吧,这样会造成redis的大key,导致性能受到影响,所以我们可以
以小时为单位,即每个小时为一个zset近24小时,就合并24个zset近7天,就合并247个zset,近30天(月),就合并2430个zset,这样我们得到了最近一小时、最近一天、最近七天的排行榜,乔碧萝看了都直呼哥哥好屌!

有了上面的思路以后我们再继续思考一个问题:如何实现以每个小时为一个zset?如何把时间切割为小时?
其实:先把当前的时间转换为为毫秒的时间戳,然后除以一个小时,即当前时间T/10006060=小时key,然后用这个小时序号作为zset的key。
例如:
2020-01-12 15:30:00=1578814200000毫秒转换小时key=1578814200000/1000*60*60=438560
2020-01-12 15:59:00=1578815940000毫秒转换小时key=1578815940000/1000*60*60=438560
2020-01-12 16:30:00=1578817800000毫秒转换小时key=1578817800000/1000*60*60=438561
剩下的以此类推有了这个思路,剩下的工作就是每次某个微博热度有变化,先计算当前的小时key,然后把当前的微博作为member,热度值作为score,加入zset中。
这里的操作其实也很好理解,就是一个简单的计算机的“取模”运算,同一个小时转化为毫秒以后不断取整以后,整数部分一定相同!
总结
至此我们已经知道了微博、百度得排行版是如何实现的,举一反三,大多大数据量下的排序我们都可以参考此实现方案!
相关文章:
【面试题】微博、百度等大厂的排行榜如何实现?
背景 现如今每个互联网平台都会提供一个排行版的功能,供人们预览最新最有热度的一些消息,比如百度: 再比如微博: 我们要知道,这些互联网平台每天产生的数据是非常大,如果我们使用MySQL的话,db实…...
com.intellij.diagnostic.PluginException 问题
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 未经允许不得转载 目录 一、导读二、 推荐阅读 一、导读 遇到…...
Altair® (澳汰尔)Inspire™ Render —— 强大的 3D 渲染和动画工具
Inspire Render 是一种全新 3D 渲染和动画工具,可供创新设计师、建筑师和数字艺术家以前所未有的速度快速制作精美的产品演示。 借助基于物理特性的内置高品质全局照明渲染引擎 Thea Render,可以快速创建、修改和拖放各种材质并添加照明环境,…...
虚幻引擎启动报错记录
0x00007FFEF0C8917C (UnrealEditor-CoreUObject.dll)处(位于 UnrealEditor.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000000000000030 时发生访问冲突。 解决办法:首先查看堆栈信息,我的项目启动是因为默认场景编译不过,进到编辑器配置文…...
最祥解决python 将Dataframe格式数据上传数据库所碰到的问题
碰到的问题 上传Datafrane格式的数据到数据库 会碰见很多错误 举几个很普遍遇到的问题(主要以SqlServer举例) 这里解释下 将截断字符串或二进制数据 这个是字符长度超过数据库设置的长度 然后还有字符转int失败 或者字符串转换日期/或时间失败 这个是碰到的需要解决的最多的问…...
【汇编语言实战】统计个数
已知10个分布在0至100内的正整数,统计大于等于60的数的个数和小于60的数的个数 C语言描述该程序流程: #include <stdio.h> int main() {int arr1[]{11,33,73,52,93,84,67,56,64,75};int num10;for(int i1;i<10;i){if(arr1[i]>60){num1;}}p…...
SQLite数据库概述及在Java中的应用
## 什么是SQLite数据库? SQLite是一种轻量级的数据库管理系统,它不需要一个独立的服务器进程或操作系统的运行,而是将整个数据库,包括定义、表、索引以及数据本身,全部存储在一个独立的磁盘文件中。SQLite的设计理念是…...
嵌入式单片机补光灯项目操作实现
1.【实验目的】 用于直播效果的补光 2.【实验原理】 原理框架图2.各部分原理及主要功能 1.充电和供电:采用5V2A tepy_c接口充电,3.7V锂电池供电, 2.功能:产品主要是用于直播或拍照时的补光。分为三个模式:白光/暧光&#x...
【3GPP】【核心网】核心网/蜂窝网络重点知识面试题二(超详细)
1. 欢迎大家订阅和关注,3GPP通信协议精讲(2G/3G/4G/5G/IMS)知识点,专栏会持续更新中.....敬请期待! 目录 1. 对于主要的LTE核心网接口,给出运行在该接口上数据的协议栈,并给出协议特征 2. 通常…...
R语言记录过程
如何使用这个函数as.peakData 函数构造过程 出现问题是缺少函数的问题 up不告诉我,这里是代表c,h,o的值,你从里面获取把值,设置成c,h,o就可以了 现在开始测试参数 第一次 startRow : 开始查找数据的第一行。不管startRow的值是多少ÿ…...
【leetcode面试经典150题】36. 旋转图像(C++)
【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…...
AOP 面向切面编程 入门练习
编写过程 添加依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><…...
【Qt】:对话框(一)
对话框 一.基本的对话框二.自定义对话框三.通过图形化界面自定义对话框四.关于对话框mode 对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者…...
数据结构与算法 — 贪心算法
数据结构与算法 数据结构与算法是计算机科学中的两个核心概念,它们在软件开发和问题解决中起着至关重要的作用。 数据结构 数据结构是计算机中存储、组织和管理数据的方式,它能够帮助我们高效地访问和修改数据。不同的数据结构适用于不同类型的应用场…...
python如何连接openGauss及django相关配置
前言 网络上很多类似教程,但是有可能不适用。这里给出官网的教程当作参考网络上的方案 安装psycopg2包。 pip install psycopg2 -i https://pypi.tuna.tsinghua.edu.cn/simple 安装完成后,导入包即可使用import psycopg2# Connect to your postgres DB…...
开箱子的游戏能做吗?
类似寻道大千、咸鱼之王、无名之辈、疯狂骑士团这种类型的游戏,大家应该都知道吧,目前非常受欢迎. 这类游戏注重玩家的成长感和探索体验,玩家在进入游戏后,就能够直接开启宝箱获得各种装备,装备的品质越好、级别越高,能为角色带来的属性加成…...
一、Spring基础 --- 基础内容(二) (咕P4)
一、IOC容器 1.1 基础 1.1.1 容器 1、Spring框架的主要功能是通过其核心容器来实现的。2、Spring容器是生成Bean的工厂,它负责创建Bean的实例,并管理其生命周期。所有的组件都被当成Bean处理,例如数据源、Hibernate的SessionFactory、事务管…...
uview2 表单Form校验validate不生效处理方法
先贴官网实例: <template><view class""><u-form :model"form" ref"uForm"><u-form-item label"姓名" prop"name"><u-input v-model"form.name" /></u-form-item&g…...
给已存在的docker容器修改端口映射
1、systemctl stop docker 2、find / -name hostconfig.json 3、cd * 4、vim hostconfig.json 5、找到“PortBindings”字段,如下所示: "PortBindings":{"80/tcp": [{ //容器内端口"HostIp": "","…...
【Keil5-调试】
Keil5-调试 ■ 好的链接■ watch窗口中,变量值不会刷新■ 当选择了非0级优化时■■ ■ 好的链接 参考地址: debug ■ watch窗口中,变量值不会刷新 有时候在watch窗口中,变量值不会刷新,这时候就需要查看一下"V…...
VAP:腾讯开源的高性能动画播放引擎,如何让你的应用动起来更流畅?
VAP:腾讯开源的高性能动画播放引擎,如何让你的应用动起来更流畅? 【免费下载链接】vap VAP是企鹅电竞开发,用于播放特效动画的实现方案。具有高压缩率、硬件解码等优点。同时支持 iOS,Android,Web 平台。 项目地址: https://git…...
计算机组成原理实验避坑指南:存储器地址映射常见错误及解决方法
计算机组成原理实验避坑指南:存储器地址映射常见错误及解决方法 第一次在Proteus里搭建存储器系统时,看着密密麻麻的地址线和片选信号,我对着实验指导书发呆了半小时——明明按照图示连接了所有线路,可写入RAM的数据总是莫名其妙出…...
Cosmos-Reason1-7B企业应用案例:研发团队用它做内部技术文档逻辑校验与补全
Cosmos-Reason1-7B企业应用案例:研发团队用它做内部技术文档逻辑校验与补全 1. 引言:技术文档的“逻辑陷阱”与AI解法 想象一下这个场景:你所在的研发团队刚刚完成了一个新模块的开发,需要撰写一份详细的技术设计文档。文档洋洋…...
Charticulator:突破传统桎梏的自定义数据可视化革新——从模板依赖到自由创作
Charticulator:突破传统桎梏的自定义数据可视化革新——从模板依赖到自由创作 【免费下载链接】charticulator Interactive Layout-Aware Construction of Bespoke Charts 项目地址: https://gitcode.com/gh_mirrors/ch/charticulator 数据可视化工具是否常常…...
3步掌握PAGExporter:After Effects动画高效导出完整指南
3步掌握PAGExporter:After Effects动画高效导出完整指南 【免费下载链接】libpag The official rendering library for PAG (Portable Animated Graphics) files that renders After Effects animations natively across multiple platforms. 项目地址: https://g…...
小米智能家居集成终极指南:5分钟快速接入HomeAssistant
小米智能家居集成终极指南:5分钟快速接入HomeAssistant 【免费下载链接】hass-xiaomi-miot Automatic integrate all Xiaomi devices to HomeAssistant via miot-spec, support Wi-Fi, BLE, ZigBee devices. 小米米家智能家居设备接入Hass集成 项目地址: https://…...
你还在用QGIS导出再读Python?实时对接Google Earth Engine的Python SDK深度调优(延迟<800ms,吞吐量提升17倍)
第一章:Python 遥感数据分析遥感数据具有多源、多时相、高维度和大体积的特点,Python 凭借其丰富的科学计算生态(如 NumPy、SciPy、GDAL/OGR、rasterio、xarray 和 scikit-learn)已成为遥感信息提取与分析的主流工具。本章聚焦于使…...
iBeebo:5个理由让你选择这款纯净高效的第三方微博客户端
iBeebo:5个理由让你选择这款纯净高效的第三方微博客户端 【免费下载链接】iBeebo 第三方新浪微博客户端 项目地址: https://gitcode.com/gh_mirrors/ib/iBeebo 在信息过载的数字时代,官方微博客户端日益臃肿的界面设计、无处不在的广告推送和复杂…...
全球蛋白质组学数据共享核心平台升级
摘要 ProteomeXchange蛋白质组学资源联盟(http://www.proteomexchange.org)的建立旨在标准化基于质谱(MS)的蛋白质组学领域开放数据实践。本文介绍了ProteomeXchange在过去3年的主要进展。该联盟的6个成员数据库分布于࿱…...
ChatBI 开源产品实战解析:从语义层到Agent,如何选择你的AI数据助手?
1. 为什么企业需要AI数据助手? 想象一下这个场景:市场部的小王需要统计上季度各区域的销售数据,他对着Excel表格里密密麻麻的数字发愁,不得不找IT部门帮忙写SQL查询。三天后拿到数据时,业务窗口期已经错过——这是很多…...
