问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

排行榜系统的设计方案

创作时间:
作者:
@小白创作中心

排行榜系统的设计方案

引用
CSDN
1.
https://blog.csdn.net/m0_63800830/article/details/145167307

排行榜系统在积分场景和投票场景中应用广泛,其设计需要兼顾实时性和历史数据的存储效率。本文将详细介绍如何设计一个既支持实时更新又便于历史数据查询的排行榜系统。

一、排行榜系统介绍

在积分场景和投票场景下排行榜很常见,排行榜系统是一个可以对接很多项目的系统,应用非常广泛。排行榜是数据可视化的常见形式,可以有效地传达信息并吸引用户的注意力。

二、业务介绍

排行榜分为实时排行榜和历史排行榜。实时排行榜需要定时更新数据,保证数据的可用性;历史排行榜是历史数据,所以不需要实时更新,只需要考虑存储时的数据安全以及查询时的查询效率。

(一)实时排行榜

实时排行榜的数据交互会非常频繁,且每次查询的数据量很大,所以需要考虑这方面的优化。可以使用Redis来保存实时榜单数据,提高查询的效率。Redis中的ZSet类型可以数据除了键值之外,还有一个score属性,可以作为分数排序,因此非常适合做排行榜等数据结构。我们可以使用榜单的版本作为key,例如榜单是每月更新一个新的榜单,就可以使用年月(yyyyMM)作为key,如果是每赛季更新一次,就可以使用赛季版本号作为key;使用用户的标识作为value;最后用榜单的排序依据作为score(积分、投票数等)。

对于实时排行榜,我们需要在新增积分时更新Redis中保存的实时排行榜数据,对于排行榜的查询可以直接从Redis中查询,需要注意的是排行榜的数据非常多,所以需要分页查询。

(二)历史排行榜

历史榜单是曾经的最后一个赛季最后一天的排名结果,积分和排名已经确定,没有实时更新排序的需求。我们可以在每个赛季第一天的凌晨,使用定时任务,将上个赛季最终的排行榜数据写入到数据库,然后就可以清空redis中上个月的积分和榜单数据了。

历史榜单保存到数据库中的表需要有的字段是:主键id、用户id、积分值、名次、赛季标识等,这些字段可以确定每一个在榜单中的谁在哪个赛季有多少积分、排名是第几位等信息。

对于历史榜单生成时,应该是在一个赛季结束时,用一个定时任务将榜单数据从Redis中持久化到数据库中,然后再清空Redis中的实时榜单缓存数据。

三、存储优化

由于榜单中的数据会随着用户的增加而达到很大的数据量,所以需要解决海量数据存储的问题。

我们可以使用水平分表的方式解决这个问题,具体做法就是:每个赛季初使用一个定时任务生成一张新的表,每个赛季的数据保存一张表中,不同赛季保存不同的表,这样赛季信息可以直接从表名中获取,我们之前设计的表字段中赛季的字段就可以去掉了;其次主键我们可以使用自增的策略生成,这样每张表的主键就是排名,表中的排名字段也可以去掉。以下就是最终的表结构设计:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号