我有一个用 Django 编写的网站。网站有用户,他们有积分,并根据他们的积分排名。
class Profile(UserenaBaseProfile):
points = models.IntegerField(default=100)
rank = models.PositiveIntegerField(...)
当用户获得积分时,他/她的排名将发生变化,其他用户也会发生变化。 问题是计算用户排名的最佳方法是什么以及我应该何时计算或多久计算一次?
谢谢。
请您参考如下方法:
可能不是每次单个用户的积分增加时更新每个用户排名的最佳方法。如果您有很多用户,这对后端来说会很苛刻。
如果你想在个人资料页面上显示用户排名,也许你可以有一个查询来获取按点排序的所有用户列表,将其单独存储为字典或其他任何内容并大量缓存。这将有利于性能。
假设您的用户列表看起来像这样(1111 等是用户 ID):
用户 = { 1111:{'用户名':'iskorum', '点数':99999 }, 2222:{'用户名':'sidarcy', '点数':9444 }, 3333:{'用户名':'joeblogs', '点数':37 } }
当谈到实际获得用户排名时,您可以简单地在这个存储的字典中找到用户的位置。
假设用户 id 是 1111
userrank = [i+1 for i,x in enumerate(sorted(USERS)) if x == 1111]
返回 1
不需要额外的数据库查询
如果它只是一个小站点,那么每次获取用户列表并找到当前用户在该列表中的位置也无妨。
但是,如果您期望有成千上万的用户,上述方法可能是更好的方法。
编辑:您还应该缓存排序列表,如下面的评论所述 每次都对列表进行排序会占用大量内存
