SpringCloud天机学堂:实时排行榜功能
文章目录
1、实时排行榜
榜单分为两类:
- 实时榜单:也就是本赛季的榜单
- 历史榜单:也就是历史赛季的榜单
本节我们先分析一下实现实时榜单功能。
1.1.思路分析
目前,我们有一个积分记录明细表,结构如下:
一个用户可能产生很多条积分记录,数据结构大概像这样:
id | userId | type | points | c_time |
---|---|---|---|---|
1 | 9527 | 1 | 10 | |
2 | 9528 | 4 | 3 | |
3 | 9529 | 2 | 1 | |
4 | 9528 | 2 | 7 | |
5 | 9529 | 4 | 3 | |
6 | 9528 | 2 | 1 | |
7 | 9527 | 1 | 10 | |
8 | 9529 | 4 | 3 | |
9 | 9527 | 3 | 5 |
要想形成排行榜,我们在查询数据库时,需要先对用户分组,再对积分求和,最终按照积分和排序,Sql语句是这样:
SELECT user_id, SUM(points) FROM points_record GROUP BY user_id ORDER BY SUM(points)
要知道,每个用户都可能会有数十甚至上百条积分记录,当用户规模达到百万规模,可能产生的积分记录就是数以亿计。
要在每次查询排行榜时,在内存中对这么多数据做分组、求和、排序,对内存和CPU的占用会非常恐怖,不太靠谱。
那该怎么办呢?
在这里给大家介绍两种不同的实现思路:
- 方案一:基于MySQL的离线排序
- 方案二:基于Redis的SortedSet
首先说方案一:简单来说,就是将数据库中的数据查询出来,在内存中自己利用算法实现排序,而后将排序得到的榜单保存到数据库中。但由于这个排序比较复杂,我们无法实时更新排行榜,而是每隔几分钟计算一次排行榜。这种方案实现起来比较复杂,而且实时性较差。不过优点是不会一直占用系统资源。
再说方案二:Redis的SortedSet底层采用了跳表的数据结构,因此可以非常高效的实现排序功能,百万用户排序轻松搞定。而且每当用户积分发生变更时,我们可以实时更新Redis中的用户积分,而SortedSet也会实时更新排名。实现起来简单、高效,实时性也非常好。缺点就是需要一直占用Redis的内存,当用户量达到数千万万时,性能有一定的下降。
当系统用户量规模达到数千万,乃至