Redis实现高并发排行榜的功能

生活中排行榜是常见的功能,如游戏的排行榜,销售额的排行榜等等,排行榜不仅可以让用户有更多的激情参与到活动中来,而且可以更好的留存住用户,如下所示的拉新排行榜:
在这里插入图片描述
排行榜是一个常见的业务需求,下面我们就来聊聊如何通过Redis来设计一套支持高并发的排行榜的功能。

1、支持高并发的Zset实现榜单方案

假设业务需要展示排名前10名的用户在榜单上,假如在每一小时内前10名必然是在前200名之中产生,我们使用Redis的Zset数据结构来设计的方案如下所示:
在这里插入图片描述(1)定时任务定期(如60分钟执行一次)从数据库中同步排名前200名用户到Redis的Zset中。

(2)Redis实时维护前200名用户数据,当榜单数据发生变化的时候,我们同步数据到Redis上和数据库中,但是数据库中数据的变化不会在下一次定时任务执行之前影响到当前的榜单数据。

(3)定时任务下一个周期到了之后,就重新同步数据库中最新的前200名排名数据到Redis上。

本方案将排名靠前的数据(前200名)放到Redis中,这样避免在Redis的Zset中实时维护全量数据的问题,同时定时任务更新数据到Redis上的周期是可以根据业务需要来变更的。

针对突发的热点数据,当前的榜单设计就难以及时反映出来,需要等到下一个定时任务的周期才能同步到Redis上,当然本方案也是适应的,因为高并发下市面上的排行榜一般都是近实时的。

2、支持超高并发的榜单设计方案

在超大数据量、超高并发下,以至于超过了Redis单一节点的上限(单个Redis的写入瓶颈在2w左右,读瓶颈在10w左右),如果使用一个Zset来维护榜单数据的时候Redis是支撑不住的,即使Redis集群部署也是没有意义的,因为一个Zset就是一个key,一个key只会落在集群的一个Redis节点上,针对这样的场景,可以考虑采用分key的方案来实现榜单功能,如下图所示:
在这里插入图片描述
(1)将Zset上原先的一个key拆分成多个小key,然后通过这些小key来存储所有的榜单数据。拆分key的方案之前龙虾也分享过,有兴趣的小伙伴可以看一下:超高并发下Redis分key的实现原理

(2)实时维护Zset上的榜单数据变化

(3)定时任务定期从各Zset节点上各取前10名的数据,然后将各个节点报送过来的前10名汇总在一起后取出全局的前10名数据,最后同步到服务器的本地缓存上。
在这里插入图片描述
在超高并发、大数据量下通过分key的方案可以有效的解决单key无法支撑的问题,这就是一种分而治之的思想。

设计本地缓存是因为在超高并发下保护Redis节点的一种做法,所有的请求都会打到本地的缓存上,Redis通过定时任务将最新的数据定期同步到本地的缓存上。

结论:(1)高并发下排行榜的功能我们可以通过定时任务+Redis的方式来实现(2)针对超高并发、大数量的的业务场景,我们采用Redis分key+本地缓存的方案来实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/33974.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字孪生像魔镜,映照出无限可能的未来

在当今科技飞速发展的时代,数字孪生作为一项极具潜力的前沿技术,正逐渐崭露头角,成为众多领域关注的焦点。它犹如一面神奇的魔镜,以数字化的方式精准映照出现实世界中的各种实体与系统,为我们开启了一扇通往无限可能未…

每日一题---

深拷贝和浅拷贝的区别是什么? null 浅拷贝是指只复制对象本身和其内部的值类型字段,但不会复制对象内部的引用类型字段。换句话说,浅拷贝只是创建一个新的对象,然后将原对象的字段值复制到新对象中,但如果原对象内部有…

Chrome 扩展开发 API实战:Sessions (六)

1. 引言 chrome.sessions 是 Chrome 扩展开发者工具的一部分,提供了对最近关闭的标签页和窗口的访问,以及对会话恢复功能的支持。现代浏览器的一个显著特点是为用户提供更多的便利性,比如快速恢复意外关闭的页面。通过 chrome.sessions API&…

Spring Boot对接twilio发送邮件信息

要在Spring Boot应用程序中对接Twilio发送邮件信息,您可以使用Twilio的SendGrid API。以下是一个简单的步骤指南,帮助您完成这一过程: 1. 创建Twilio账户并获取API密钥 注册一个Twilio账户(如果您还没有的话)。在Twi…

学习15天:pytest

1、.pytest强大的插件 pytest-html(生成html格式的自动化测试报告) pytest-xdist测试用例分布式执行。多CPU分发。 pytest-ordering 用于改变测试用例的执行顺序 pytest-rerunfailures用例失败后重跑 allure-pytest 用于生成美观的测试报告。 2、规则: 模块…

Springboot+mybatis实现增删改查操作

继续写一下删除操作,删除有些不一样,首先在controller里面,我们需要改一下路由,我们后面要写/{id}传入路径参数,用PathVariable注解绑定id,剩下的都一样,传入id,然后写service和mapp…

Visual Studio里的调试(debugging)功能介绍

参考 1- Introduction to Debugging | Basic Visual Studio Debugging(这是一位印度博主视频,我下面做到笔记也主要参考她的视频,但不得不说口音太重了,一股咖喱味) 目录 个人对调试浅显的认识和对调试的介绍逐行调…

Java多线程与高并发专题——原子类和 volatile、synchronized 有什么异同?

原子类和 volatile异同 首先,通过我们对原子类和的了解,原子类和volatile 都能保证多线程环境下的数据可见性。在多线程程序中,每个线程都有自己的工作内存,当多个线程访问共享变量时,可能会出现一个线程修改了共享变…

c语言笔记 作用域

目录 作用域的基本概念 1.函数声明的作用域 2.局部变量的作用域 3.全局作用域 4.static修饰后的作用域 作用域的基本概念 在c语言中,我们的标志符是具有一定的可见范围的,我们称这个可见范围为作用域 在软件开发中,我们要确定好标识符的作…

MySQL数据库知识总结

MySQL数据库知识总结 一、基本概念及其介绍二、数据库中的数据类型(一)数值类型(二)字符串类型(三)日期类型 三、数据库基础语法(一)数据库的常用操作(二)数据…

SpaceSync智能排班:重构未来办公空间的神经中枢

文心智能体平台可免费使用DeepSeek 满血版啦,使用DeepSeek模型创建并提交智能体,即有机会瓜分万元奖金!有这等好事还不快冲! 文心智能体官网:文心智能体平台AgentBuilder | 想象即现实 本片文章为作者参加文心智能体平…

Blender-MCP服务源码3-插件开发

Blender-MCP服务源码3-插件开发 Blender-MCP服务源码解读-如何进行Blender插件开发 1-核心知识点 1)使用Blender开发框架学习如何进行Blender调试2)学习目标1-移除所有的Blender业务-了解如何MCP到底做了什么?3)学习目标2-模拟MC…

每日一题---dd爱框框(Java中输入数据过多)

dd爱框框 实例: 输入: 10 20 1 1 6 10 9 3 3 5 3 7 输出: 3 5 这道题要解决Java中输入的数过多时,时间不足的的问题。 应用这个输入模板即可解决: Java中输入大量数据 import java.util.*; import java.io.*;pu…

Qlik Sense New Install with Restore

Background In case you meet the upgrade issue like us , you can follow the below step to recover the existing data to new installed Qlik Sense . Powered by Moshow郑锴-CSDN博客 please follow below steps: pgsql dump backupbackup table into sql by DBeaverst…

大数据-spark3.5安装部署之standalone模式

真实工作中还是要将应用提交到集群中去执行,Standalone模式就是使用Spark自身节点运行的集群模式,体现了经典的master-slave模式。集群共三台机器,具体如下 u22server4spark: master worker u22server4spark2: worke…

Uniapp 开发 App 端上架用户隐私协议实现指南

文章目录 引言一、为什么需要用户隐私协议?二、Uniapp 中实现用户隐私协议的步骤2.1 编写隐私协议内容2.2 在 Uniapp 中集成隐私协议2.3 DCloud数据采集说明2.4 配置方式3.1 Apple App Store3.2 Google Play Store 四、常见问题与解决方案4.1 隐私协议内容不完整4.2…

【C++】 —— 笔试刷题day_5

刷题day_5 一、游游的you 题目链接:游游的you 题目解析 题目要求: 输入a,b,c表示y、o、u三个字母的个数; 将这些字母连成字符串,并且这里you三个字母相邻获得2分,两个o字母相邻获得1分。 让我…

78. Harmonyos NEXT 懒加载数据源实现解析:BasicDataSource与CommonLazyDataSourceModel详解

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! Harmonyos NEXT 懒加载数据源实现解析:BasicDataSource与CommonLazyDataSourceModel详解 文章目录 Harmonyos NEXT 懒加载数据源实现解…

如何打包数据库mysql数据,并上传到虚拟机上进行部署?

1.连接数据库,使得我们能看到数据库信息,才能进行打包上传 2. 3. 导出结果如下,是xml文件 4.可以查询每个xml文件的属性,确保有大小,这样才是真实导出 5跟着黑马,新建文件夹,并且把对应的东西放…

Springboot+mabatis增删改查,设置不可重复字段

今天又学会了一个操作,我们数据库中,可能要求一个字段名字不可以重复,我们就进行这样的操作!设计表,然后点击索引,选择字段,加入索引类型和索引方法,然后ctrlS保存!即可 如果一旦还…