3

我有一个用 django 编写的网站。网站有根据他们的积分获得积分和排名的用户。

class Profile(UserenaBaseProfile):
    points = models.IntegerField(default=100)
    rank = models.PositiveIntegerField(...)

当用户获得积分时,他/她的排名将会改变,其他用户也会改变。问题是计算用户排名的最佳方法是什么,我应该何时计算或多久计算一次?

谢谢。

4

1 回答 1

2

每次单个用户的积分增加时,可能不是更新每个用户的排名的最佳方法。如果你有很多用户,这对后端来说会很苛刻。

如果您想在个人资料页面上显示用户排名,也许您可​​以有一个查询来获取按点排序的所有用户的列表,将其单独存储为字典或其他任何内容并大量缓存它。这将对性能更好。

所以假设您的用户列表看起来像这样(1111 等是用户 ID):

USERS = { 1111: {'username': 'iskorum', 'points':99999 }, 2222: {'username': 'sidarcy', 'points':9444 }, 3333: {'username': 'joeblogs', 'points':37 } }

在实际获得用户排名时,您可以简单地在这个存储的字典中找到用户的位置。

假设用户 ID 是 1111

userrank = [i+1 for i,x in enumerate(sorted(USERS)) if x == 1111]

返回 1

不需要额外的数据库查询

如果它只是一个小站点,每次都获取用户列表并在该列表中查找当前用户位置没有害处。

但是,如果您期望有成千上万的用户,则上述方法可能是更好的方法。

编辑:您还应该缓存排序列表,如下面的评论中所述,每次对列表进行排序可能会占用大量内存

于 2012-11-09T10:46:48.437 回答