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

再比如微博:

我们要知道,这些互联网平台每天产生的数据是非常大,如果我们使用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…...
AI Agent交互设计新范式:基于Leader Key的可编程对话流实践
1. 项目概述与核心价值最近在折腾AI智能体(AI Agent)的开发,发现一个挺有意思的现象:很多开发者,包括我自己在内,在初期都会把大量精力花在模型调用、工具链集成这些“硬核”功能上,却常常忽略了…...
我们团队的技术债已经堆成山,我用这四步说服老板给时间重构
在软件测试的日常工作中,我们或许是技术债最敏锐的感知者。每一次回归测试的漫长等待,每一个在“祖传代码”上小心翼翼打补丁的深夜,每一份因环境不稳定而飘红的测试报告,都在无声地控诉着那座压得团队喘不过气的“屎山”。然而&a…...
GitHub仓库自动化同步工具xpull:原理、配置与实战应用
1. 项目概述:一个被低估的GitHub数据同步利器 如果你经常在GitHub上管理多个仓库,或者需要将某个仓库的特定分支、标签甚至整个提交历史同步到另一个仓库,那么你很可能经历过手动操作的繁琐。无论是为了备份、镜像、还是将上游的更新合并到自…...
Arm Neoverse CMN-650架构与编程实践详解
1. CMN-650架构概述Arm Neoverse CMN-650是一种基于Mesh拓扑的一致性互连网络,专为多核处理器和加速器系统设计。作为SoC内部的数据高速公路,它通过优化的路由算法和一致性协议,实现了高带宽、低延迟的核间通信。1.1 核心组件解析CMN-650由多…...
STM32F429IGT6项目实战:基于STM32CubeMX的SDRAM配置与性能优化
1. 为什么需要SDRAM配置 在嵌入式开发中,尤其是使用STM32F429IGT6这类高性能MCU时,SDRAM(同步动态随机存取存储器)的配置往往成为项目成败的关键。我曾在多个图形界面项目中深刻体会到,当需要处理高分辨率图像或大量数…...
未来是神经-符号的:AI 推理是如何演变的
原文:towardsdatascience.com/the-future-is-neuro-symbolic-how-ai-reasoning-is-evolving-143ce6485b4f 人工智能软件被用于增强本文文本的语法、流畅性和可读性。 一个名为AlphaGeometry的显著新 AI 系统最近解决了大多数人类都难以解决的困难高中水平数学问题。…...
车载网络测试演进:从CAN总线到TSN与SOA的实战解析
1. 项目概述:一场关于“神经”与“体检”的进化史几年前,我和几个同行在路边摊就着麻小和扎啤,聊起车载以太网测试,那时它还是个新鲜玩意儿,大家讨论的焦点更多是“要不要做”和“怎么做”。几年过去,再回头…...
别光抄答案!用Python函数通关Educoder计算思维训练,我总结了这3个实战技巧
用Python函数通关Educoder计算思维训练的3个实战技巧 当你在Educoder平台面对Python函数题目时,是否曾陷入"看懂答案却不会独立解题"的困境?本文将从计算思维的本质出发,分享三个突破函数学习瓶颈的实战技巧。不同于直接提供参考答…...
Acton性能调优终极指南:10个提升TON智能合约开发效率的技巧 [特殊字符]
Acton性能调优终极指南:10个提升TON智能合约开发效率的技巧 🚀 【免费下载链接】acton Toolchain for TON smart contract development and beyond 项目地址: https://gitcode.com/GitHub_Trending/acto/acton Acton是TON区块链上强大的智能合约开…...
达梦数据库主备集群手工搭建及主备切换演练
环境:DM8、Linux(CentOS 7 ),三台服务器。 本文记录从零搭一套"一主一备一监视" 式的主备集群,纯手工操作,不依赖图形化工具。 一、环境规划 1.1 IP规划 角色主机名业务IP心跳IP实例名主库&…...
