【问题标题】:Real time update of relative leaderboard for each user among friends实时更新好友中每个用户的相关排行榜
【发布时间】:2010-12-10 08:34:34
【问题描述】:

我一直在研究我的应用程序的一项功能来实现排行榜 - 基本上是根据用户的得分对用户进行排名。我目前在个人基础上跟踪分数。我的想法是,这个排行榜应该是相对的,而不是绝对的,也就是说,它不是整个网站上得分最高的前 10 名用户,而是用户朋友网络中的前 10 名。这似乎更好,因为每个人都有机会成为他们网络中的第一名,并且对于那些对这类事情感兴趣的人来说,存在一种友好的竞争形式。我已经存储了每个用户的分数,所以挑战是如何以有效的方式实时计算该分数的排名。我使用的是 Google App Engine,因此有一些好处和限制(例如,IN [array])查询对数组的每个元素执行子查询,并且每个语句限制为 30 个元素

例如

第一个杰克 100

第二约翰 50

这是我想出的方法,但它们似乎都效率低下,我认为这个社区可以想出更优雅的方法。我的感觉是,任何解决方案都可能使用 cron 来完成,并且我将存储每日排名和列表顺序以优化读取操作,但如果有更轻量级和实时的东西会很酷

  1. 拉取按分数排序的站点所有用户列表。 对于每个用户,从该列表中选择他们的朋友并创建新的排名。 存储排名和列表顺序。 每天更新。 缺点 - 如果我有很多用户,这将需要很长时间

2a。为每个用户选择他们的朋友,并为每个朋友选择分数。 对该列表进行排序。 存储排名和列表顺序。 每天更新。 记录每个用户的最后位置,以便之前的列表可以用于下一次更新的重新排序,以提高效率(可以节省排序时间)

2b。与上面相同,只是只计算在最后一天查看过个人资料的人的排名和列表顺序 缺点 - 只有第二个查看个人资料的人的排名是最新的

【问题讨论】:

    标签: python google-app-engine leaderboard


    【解决方案1】:

    如果与读取相比,写入非常罕见(大多数键值存储中的一个关键假设,而不仅仅是那些;-),那么您可能更愿意在需要更新分数时花点时间(写入)而不是获得相对排行榜(一读)。具体来说,当用户的分数发生变化时,为他们的每个朋友排队任务以更新他们的“相对排行榜”并将这些排行榜保持为列表属性(确实保持顺序!-)适当排序(是的,后者是非规范化 - 它是通常需要去规范化,即适当地复制信息,以充分利用键值存储!-)。

    当然,当友谊(用户与用户的连接)消失或出现时,您也会更新相关排行榜,但(我想)这些应该比分数更新更罕见;-)。

    如果写入非常频繁,因为您不需要完全精确的最新信息(即,它不是财务/会计信息;-),您仍然可以尝试许多可行的方法。

    例如,大的分数变化(罕见)可能会触发相对排行榜的重新计算,而较小的分数变化(更频繁)会被隐藏起来,并且只会在“当你找到它时”偶尔应用一次。如果没有关于各种幅度的更新频率、典型的网络友好集群大小等的大致数字,很难更具体。我知道,和其他人一样,你想要一个完美的方法,无论大小和频率有多么不同有问题...但是,您就是找不到!-)

    【讨论】:

    • 谢谢,这很有帮助。写入非常频繁,因为用户每天只为使用该应用程序而积累积分。我没有想到有某种“增量检查”来决定何时更新相关板的方法(例如,当有人跳过 10 分或更多时排队更新),这将确保重新计算只发生在非常活跃的情况下用户。然后,如果它越来越频繁地被击中,我可以增加这个常数,以最大限度地减少重新计算练习。如果您有任何其他想法,请告诉我
    • 一些粗略的指标。每个用户将平均产生 10 个积分,这些积分将分配给 10 个朋友 - 每个朋友获得 1 个积分。因此,如果一个典型用户有 10 个朋友,那么该用户每天将累积 100 分 - 我可能会使用 50 分作为跨网络更新的阈值
    • 一个想法可能是:对于新手用户(例如
    【解决方案2】:

    有一个python库可用于存储排名:

    http://code.google.com/p/google-app-engine-ranklist/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 2014-11-13
      • 1970-01-01
      • 2010-12-31
      相关资源
      最近更新 更多