我有一个用 django 编写的网站。网站有根据他们的积分获得积分和排名的用户。
class Profile(UserenaBaseProfile):
points = models.IntegerField(default=100)
rank = models.PositiveIntegerField(...)
当用户获得积分时,他/她的排名将会改变,其他用户也会改变。问题是计算用户排名的最佳方法是什么,我应该何时计算或多久计算一次?
谢谢。
每次单个用户的积分增加时,可能不是更新每个用户的排名的最佳方法。如果你有很多用户,这对后端来说会很苛刻。
如果您想在个人资料页面上显示用户排名,也许您可以有一个查询来获取按点排序的所有用户的列表,将其单独存储为字典或其他任何内容并大量缓存它。这将对性能更好。
所以假设您的用户列表看起来像这样(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
不需要额外的数据库查询
如果它只是一个小站点,每次都获取用户列表并在该列表中查找当前用户位置没有害处。
但是,如果您期望有成千上万的用户,则上述方法可能是更好的方法。
编辑:您还应该缓存排序列表,如下面的评论中所述,每次对列表进行排序可能会占用大量内存