需要一个单独的表来缓存排行榜(MongoDB)的前10个分数?

时间:2013-05-29 20:16:32

标签: mongodb database-design schema backend

我有以下情况的问题:

我已经有一个分数表,为每个用户存储每个游戏的最佳分数。大约一个用户在得分表中有大约10行,用于该用户的10个游戏的最高分。如果我想获得排行榜的前10位用户,理论上我可以直接查询得分表。但我担心如果得分表中的用户太多而且很多用户同时查询前10名,那么服务器上的查询会花费太长时间吗?

是否值得创建一个单独的表来缓存每个游戏的前10位用户,以便缓存表大小固定,查询时间不会随着用户数量的增加而扩大?我可以像每一小时一样更新缓存表。

我不确定不同的数据库可能会有所不同。现在我使用的是Parse.comd Server提供的MongoDB。我可能稍后转移到其他数据库(如MySql)。

2 个答案:

答案 0 :(得分:1)

我强烈建议您查看一个记分板的缓存。

你已经看到,有很多用户和很多游戏,随着时间的推移,保持最高分数板的最新和准确将变得越来越昂贵。

您可以使用Mongo预处理结果并将它们存储在不同的集合中,但您也可以考虑使用Couchbase(http://www.couchbase.com/),Memcached(http://memcached.org/)或Redis({{ 3}})缓存你的数据。

缓存分数的好方法......

  1. 对于给定游戏的所有用户的前10个列表,请将缓存过期时间设置为1-5分钟。因此,5分钟后它将运行您的Mongo查询并刷新缓存。您需要决定数据的新鲜程度。

  2. 对于用户自己的高分板...将其缓存数天。当他们完成游戏并获得新的高分后,您可以主动使其过期。只有这样你才能刷新它。

  3. 这个想法是确定哪些数据需要主动过期,哪些数据可以自行过期。

    另外作为一个说明,我建议尽可能努力使一切都自行过期。更容易管理。

答案 1 :(得分:0)

这完全是我将在游戏中创建的内容,因为我有多个游戏关卡(简单,中等,难度),我需要存储每个级别的前10名。为了减少对parse.com的api调用次数,我将在解析时创建一个云后台作业,每5分钟运行一次,为每个级别创建一个前10名的缓存表,在我的客户端应用程序上,我只选择这个整个缓存表有一次api通话的30条记录。