周排行榜如何实现可查看历史数据的功能

说一下背景和需求

一个小游戏项目,用户玩游戏会获得积分,排行榜是用玩家单局最高游戏积分进行排名的。每周结算一次,需要实现的功能是玩家可以看到他在每一周的排名。比如第一周他排名105,第二周排名57.
注:玩家的分数是不清零的,比如第一周玩家A最高分是500,第二周没刷新记录的话,那么玩家A的最高分还是500,并且还是用500进行排名

目前的方案

目前我采用的方法是分表存储每一周的排名,然后写了一个结算的脚本。在每周日的零点执行结算。(结算脚本就是把本周排行榜玩家的分数迁移复制到下周的排行榜表里,如果玩家最大分数变化了会自动更新排行榜表里的分数)

我的疑问

采用分表感觉不是很好的方案,因为周期越多,意味着表的数量也越多。项目运行个一年就得四五十张表(还只是排行榜)所以特别想知道有没有好的方案,大家都是怎么做的呢?如果能提供一些思路的话,不胜感激!!!

补充

第一次提问,虽然已经看过了《提问的智慧》,但还是可能会有疏忽的地方,如果您愿意回答我的问题,并且需要我提供些什么。请留言,我看到会第一时间回复。

陈先生
最佳答案

大致就是一个可查看历史的消费排行榜的功能。这点东西就分库分表也太看不起 MySQL 了。 按照最简单的设计,用户的消费额是一个字段,那也就是说 一共需要两张表

  1. 用户表, 主要包含 用户id ,当前积分数
  2. 记录表,主要包含 用户id ,结算期数 ,排行。

排序的问题不要去算,直接丢进redis 做一个 有序列表。 去redis 里面拿出来后去你用户表里面查不就知道了, 有一个注意事项就是当用户的积分变动的时候记得更新 redis。 每周去算一下排名,更新一下redis ,写一下当前的记录。就连论坛里面的 @MArtian 都能做出来的东西。

大致看了下 没发现什么问题。你可以先按照这个方式试试

1年前 评论
bneglect (楼主) 1年前
MArtian 1年前
陈先生 (作者) 1年前
MArtian 1年前
wxf666 1年前
讨论数量: 17
陈先生

大致就是一个可查看历史的消费排行榜的功能。这点东西就分库分表也太看不起 MySQL 了。 按照最简单的设计,用户的消费额是一个字段,那也就是说 一共需要两张表

  1. 用户表, 主要包含 用户id ,当前积分数
  2. 记录表,主要包含 用户id ,结算期数 ,排行。

排序的问题不要去算,直接丢进redis 做一个 有序列表。 去redis 里面拿出来后去你用户表里面查不就知道了, 有一个注意事项就是当用户的积分变动的时候记得更新 redis。 每周去算一下排名,更新一下redis ,写一下当前的记录。就连论坛里面的 @MArtian 都能做出来的东西。

大致看了下 没发现什么问题。你可以先按照这个方式试试

1年前 评论
bneglect (楼主) 1年前
MArtian 1年前
陈先生 (作者) 1年前
MArtian 1年前
wxf666 1年前

一直请求数据库,不会影响效率吗?用redis做排行榜不好吗

1年前 评论
bneglect (楼主) 1年前

我理解的: 按照每个用户的最高分进行排名,不知道题目有没有理解错误。
如果是这样的一个用户积分日志表,存所有用户单局积分记录
一个用户最高分记录表,如果用户每次刷新记录就讲更新该用户的最高纪录分数和时间(第一次为新增)
之后无论排序多少名次直接用过最高分记录表排序即可,查询当前用户历史记录就差积分日志表
不知道对你有没有帮助

1年前 评论
snakelis (作者) 1年前
bneglect (楼主) 1年前
bneglect (楼主) 1年前
snakelis (作者) 1年前
bneglect (楼主) 1年前
zhuzixian520

我来晚了,最佳答案被拿走了 :joy:

1年前 评论
bneglect (楼主) 1年前
zhuzixian520 (作者) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!