0

我有以下情况的问题:

我已经有一个分数表,存储每个用户的每个游戏的最佳分数。大约一个用户在得分表中大约有 10 行该用户的 10 场比赛的最高得分。如果我想获得排行榜的整体前 10 名用户,理论上我可以直接查询分数表。但是我担心如果score表中的用户太多,同时有很多用户同时查询前10名,在服务器上查询会不会太长?

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

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

4

2 回答 2

1

我强烈建议研究计分板的缓存。

您已经看到,在拥有大量用户和大量游戏的情况下,随着时间的推移,保持最高得分板的最新和准确将变得越来越昂贵。

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

缓存分数的好方法...

  1. 对于给定游戏的所有用户的前 10 名列表,请将缓存过期时间设置为 1-5 分钟。所以 5 分钟后它会运行你的 Mongo 查询并刷新缓存。你必须决定你希望这些数据有多新鲜。

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

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

另外作为说明,我建议尽可能努力使所有内容自行过期。更容易管理。

于 2013-05-30T17:28:48.123 回答
0

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

于 2014-11-05T14:17:39.517 回答