ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python-Google App Engine中的全球排行榜

2019-11-22 03:05:34  阅读:223  来源: 互联网

标签:google-app-engine cron leaderboard python


我想使用Google App Engine(Python)为移动游戏构建一个后端,其中包括所有玩家的“实时”全球排行榜,持续特定天数的事件.

典型用法如下:
-用户开始并结束一场战斗,获得积分(一场战斗需要2-5分钟)
-在活动期间,积分将累积在玩家的帐户中.
-玩家可以随时查看排行榜.
-排行榜将返回前10名玩家,以及5名刚好高于和低于该玩家得分的玩家.

现在,实时方面没有任何实际限制,可以每30秒更新一次,每小时更新一次.我希望它尽可能快,而又不会花费太多.

由于我对GAE不太熟悉,因此我想到了以下解决方案:

>每个玩家实体都有一个event_points属性
>定期使用Cron作业,对分数不为零的所有玩家进行查询.查询是
排序.
> cron作业然后遍历查询结果,写回每个Player实体中的排名.

当我想到这个解决方案时,感觉非常“蛮力”.

该解决方案的问题在于所有实体的读写成本.
如果最终有5万活跃用户,这将意味着按固定间隔对50K 1读取和50k 1写入进行排序查询,这可能会非常昂贵(取决于间隔)

我知道内存缓存可以防止某些读取和某些写入,但是如果某些实体不在内存缓存中,查询它是否有意义?
另外,我已经读到memcache可以随时刷新,因此除非有一种廉价的“备份”方法,否则使用似乎很危险,因为数据相对重要.

有没有更简单的方法来解决这个问题?

解决方法:

您不需要50,000次读取或50,000次写入.解决方案是在points属性上设置排序顺序.每次更新时,数据存储区都会自动更新其顺序,这意味着除了points属性之外,您不需要rank属性.因此,您不需要计划任务.

然后,当您需要检索排行榜时,您将运行两个查询:一个查询6个与您的用户拥有更多或相等数量点的实体;另一个查询则是与您的用户拥有相同或更多点的实体.第二个-用于6个点数较少或相等的实体.合并结果,这就是您要显示给用户的内容.

至于排名前10位的查询,您可能希望将其结果放入Memcache中,到期时间为5分钟.需要时,首先检查Memcache.如果未找到,请运行查询并更新Memcache.

编辑:

澄清查询部分.您需要设置排序顺序和不等式过滤器的正确组合,以获得所需的结果.根据App Engine文档,该查询按以下顺序执行:

  1. Identifies the index corresponding to the query’s kind, filter
    properties, filter operators, and sort orders.
  2. Scans from the
    beginning of the index to the first entity that meets all of the
    query’s filter conditions.
  3. Continues scanning the index, returning
    each entity in turn, until it encounters an entity that does not meet
    the filter conditions, or reaches the end of the index, or has
    collected the maximum number of results requested by the query.

因此,对于一个查询,您需要将ASCENDING顺序与GREATER_THAN_OR_EQUAL过滤器组合,对于另一查询,将DESCENDING顺序与LESS_THAN_OR_EQUAL过滤器组合.在这两种情况下,都将要检索的结果限制设置为6.

还有一点需要注意:您将限制设置为6个实体,因为这两个查询都将返回用户本身.您可以添加另一个过滤器(在用户ID中添加userId NOT_EQUAL),但我不建议这样做-节省的成本不值一提.显然,您不能对点使用GREATER_THAN / LESS_THAN过滤器,因为许多用户可能拥有相同数量的点.

标签:google-app-engine,cron,leaderboard,python
来源: https://codeday.me/bug/20191122/2056795.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有