Python 实时更新好友中每个用户的相对排行榜

Python 实时更新好友中每个用户的相对排行榜,python,google-app-engine,leaderboard,Python,Google App Engine,Leaderboard,我一直在开发我的应用程序的一个功能,以实现排行榜——基本上是根据用户的得分对其进行排名。我目前正在跟踪个人的分数。我的想法是,这个排行榜应该是相对的,而不是绝对的,也就是说,它不是网站上得分最高的前十名用户,而是用户朋友网络中的前十名。这似乎更好,因为每个人都有机会在自己的人际网络中成为第一,而对这类事情感兴趣的人有一种友好的竞争形式。我已经为每个用户存储了分数,所以挑战在于如何以高效的方式实时计算分数的排名。Im使用Google App Engine,因此有一些优点和局限性(例如,在[arra

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

比如说

第一千斤顶100

第二约翰50

以下是我提出的方法,但它们似乎都是低效的,我认为这个社区可以提出一些更优雅的方法。我的感觉是,任何解决方案都可能使用cron完成,我将存储每日排名和列表顺序以优化读取操作,但如果有更轻量级和实时性更好的解决方案,那就太酷了

  • 拉取按分数排序的站点所有用户的列表。 对于每个用户,从列表中选择他们的朋友并创建新的排名。 存储排名和列表顺序。 每日更新。 缺点-如果我有很多用户,这将花费很长时间
  • 2a。为每个用户选择他们的朋友,为每个朋友选择分数。 把那张单子排序。 存储排名和列表顺序。 每日更新。 记录每个用户的最后位置,以便可以使用预先存在的列表为下一次更新重新排序,以提高效率(可能节省排序时间)

    2b。与上面相同,只是只计算在最后一天查看过个人资料的人员的排名和列表顺序
    Cons-rank仅对查看档案的第二个人是最新的

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

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

    如果书写非常频繁,因为您不需要精确到第二个信息(即,它不是财务/会计信息;-),您仍然有许多可行的方法可以尝试


    例如,大分数变化(罕见)可能会触发相对排行榜的重新计算,而小分数变化(更频繁)则会被隐藏起来,并且只在“你有时间”时应用一次。如果没有关于各种规模的更新频率、典型的网络友谊群集大小等的大致数字,很难更具体地说明。我知道,和其他人一样,无论大小和频率有多大,你都希望有一个完美的方法可以应用。。。但是,你就是找不到

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

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

    如果书写非常频繁,因为您不需要精确到第二个信息(即,它不是财务/会计信息;-),您仍然有许多可行的方法可以尝试


    例如,大分数变化(罕见)可能会触发相对排行榜的重新计算,而小分数变化(更频繁)则会被隐藏起来,并且只在“你有时间”时应用一次。如果没有关于各种规模的更新频率、典型的网络友谊群集大小等的大致数字,很难更具体地说明。我知道,和其他人一样,无论大小和频率有多大,你都希望有一个完美的方法可以应用。。。但是,你就是找不到

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


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


    谢谢,这很有帮助。写操作非常频繁,因为用户只是为了每天使用应用程序而累积点数。我还没有想过使用某种形式的“增量检查”来决定何时更新相关板(例如,当有人以10分或更多的分数跳转时,排队更新),这将确保只对非常活跃的用户进行重新计算。如果这个常数被越来越频繁地击中,我可以增加它,以最小化重新计算的工作量。如果您有其他想法,请告诉我一些粗略的指标。每个用户将平均生成10个