因业务需求现在是需要在原有系统中加入用户排行榜功能。举个粒子:现在是有个订单表,要通过这个订单表来查询每个用户在一段时间内的总下单数量和支付金额总额,跟据支付总金额来计算排名,页面上是只需要展示前十名,但有个自己的排名位数,就是每个用户进来这个页面都能看到自己的具体排名,不考虑排名一样的情况,这种情况下如何设计数据库或者有什么其他的方法能够更高效的查出当前用户排名及排行榜,目前本人是通过mysql的分组统计查询来得到每个用户的下单总数和支付金额总额并且已经计算出排名,但能想到的是这条sql效率真的非常差,目前能还想到的一个方案是新建一张表保存截止到当天的排行信息,在每天的凌晨通过上面我写的统计sql来更新排行榜表,这样就能做到快速的响应每个用户的排行名次,现在就是想知道有啥更好的解决方案或者表设计,因为现在是只需要月榜,如果数据表设计的太死的话那以后需要周榜年榜就不好做了,希望各路大神不吝赐教!
感谢大神的热心回答,通过各位回答,我明白了要做排行榜功能使用redis的有序集合来做非常合适,但我目前是有个问题就是我需要的排行榜不仅仅是把名次排出来,我还需要把其他的内容也能查出来,就拿上面例子来说吧,通过用户当月的支付总额来排名,但我需要显示的排行榜不仅仅是用户名和支付总额,我还需要在排行榜中显示这个用户的当月的下单数量,redis的有序集合一个是用户id,一个就是用来排名的支付总额,对于这个场景就无能为力吧!难道再用下单数量来维护一个集合,查出排行榜再去集合里面查下单数量?
4 回答

桃花长相依
TA贡献1860条经验 获得超8个赞
使用Redis的Zset有序集合来做。每天对应一个ZSET进行实时更新SCORE可以用ZINCRBY xxxx:20170913 100 apple,如果要统计一周,一月啥的可以用ZUNIONSTORE,前几名可以用ZREVRANGE

蝴蝶刀刀
TA贡献1801条经验 获得超8个赞
异步计算, 然后保存. 前台仅读取计算结果.
在用户下单以后, 需要发出重新计算排行榜的通知, 后台任务接到通知后, 计算排行榜.
这需要通过一个中间消息系统做中转, 比如redis的发布订阅功能, redis的队列结构, kafka, rmq, 等等.
以redis的队列为例,
用户下单成功以后, 给队列里面添加数据, 说明某用户下单成功了.
后台有任务在运行, 一直监听此队列, 收到数据就计算排行榜.

有只小跳蛙
TA贡献1824条经验 获得超8个赞
排行榜就用redis的有序集合实现,至于排行榜中还要展示下单的总数量,可以用redis的别的结构来存储,比如hash,或者就想楼上说的用集合的交并集来实现,如果排行榜有多重形式或者多种排名方式,那就可以参照楼上的建议,如果想用一个有序集合来实现展示总金额和当月下单总量,那你想多了
- 4 回答
- 0 关注
- 688 浏览
添加回答
举报
0/150
提交
取消