0

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

例如

第一千斤顶 100

约翰二书 50

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

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

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

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

4

2 回答 2

4

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

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

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

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

于 2009-10-27T04:01:13.137 回答
1

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

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

于 2009-10-27T19:18:14.630 回答