投票排名系统(1)——场景分析与介绍

Posted by Beyonderwei on 2021-07-31
Words 958 and Reading Time 3 Minutes
Viewed Times

重要说明:
       这是一个系列文章,如果你也正在做或打算做这样一个投票排名系统,请耐心看完,相信你一定会有所收获,该系列文章仅是作者觉得还不错的实现方式,可能你在哪些地方会有更好的想法,欢迎在评论区留下你的想法和建议。(主要基于MySQL和Redis实现)

一、你将收获什么

       通过一个简单但常见的具有高并发场景的小例子,分享在整个系统设计过程中各种问题的处理,包括缓存设计、数据持久化方案,通过提问的方式激发你更多的思考,让我们一起学习成长。

二、序言

       无论学习还是做需求,投票排名是一个出现频繁且重要的业务场景,可能你在生活中就经常会接触到,比如下面这些:

  1. 某博客平台按照点赞数、新增评论等作为评判条件,出一个最受欢迎文章的界面
  2. 某本地生活平台根据消费数量,出一个本周最受欢迎店家的界面
  3. 某娱乐平台要向公众统计最受欢迎的十大歌手
  4. 某直播平台搞主播PK活动,要排一个礼物榜

       这些场景我们或许都不陌生,你可能在学校就会遇到类似这样的项目,但本质上他们都是一个投票排名系统。这里以【主播PK活动】为例,讲述具体的实现过程。

       为什么是【主播PK】: 使用这个例子的原因在于可以让你排除一些外部干扰,比如文章投票可能你会顾虑到刷访问量,点赞、评论等情况,你要考虑到统计访问用户、点赞用户等情况(当然都可以实现)。但主播PK场景的每一票都相当于真实的钱,你刷任你刷。

三、场景分析

       首先我们需要分析一下这个场景有什么特点,然后再去寻找解决方案。综合分析特点如下:

  • 需要一个前端页面来展示主播排名结果,这里以一个前端网页为例
  • 这个前端页面(特别是前几页)需要面对大量用户的高并发请求
  • 票数经常变化(大量用户给大量主播送礼物)
  • 排名要近乎实时更新
  • 数据要有持久化策略,不能一直在缓存中。

四、解决方案

1. 前端页面资源

       由于前端页面(特别是前几页)需要面对大量用户的高并发请求,所以前端的页面可以放在CDN上。

2.票数经常变化

       场景下大量用户给大量主播送礼物,每个主播的 “票数”变化频繁,不可能直接操作数据库,因此要有缓存,变化第一时间实际上是写到缓存中,肯定需要Redis。

3. 排名要近乎实时更新

       要能快速的统计出排名,方便分页查询获取排名的某页数据。因此肯定会用到Redis Sorted Set的数据类型。

4. 数据信息持久化

       票数信息要持久化到数据库,避免缓存崩掉数据丢失,当然可以使用MySQL、MongoDB等。

五、总结

       通过上面的分析可以看出,重点在于缓存设计以及持久化方案。具体实现方式参考下节。


本文为作者原创文章,未经作者允许不得转载。

...

...

00:00
00:00