网页排行榜

时间:2012-01-27 22:31:03

标签: sql django database redis

我在我的django网络应用中实施了排行榜,并且不知道最好的方法。目前,我只是使用SQL来订购我的用户,然后创建一个排行榜,但这会产生两个主要问题:

  1. 表现令人震惊。我只尝试将其扩展到几百个用户,但我可以说计算排名很慢而且过度缓存很烦人,因为我需要用户在添加到排行榜后查看他们的排名。

  2. 如果不再执行整个排行榜计算,几乎不可能告诉用户他们的位置。

  3. 我还没有部署,但我估计Leaderboard的5%更新与95%的阅读(实际上可能更多)排行榜。所以我的最新想法是每次添加用户时再次计算排行榜,并且我可以轻松排序位置字段,无需重新计算以显示用户的排名。

    但是,如果多个用户同时提交,锁定是否足够或者排名是否有问题,这可能是一个问题吗?另外,我打算将它放在一个单独的数据库中,仅用于这些排行榜,这是最好的?我听到有关redis的好消息......

    有什么更好的方法可以解决这个问题吗? (谁知道SO如何制作他们的排行榜?)

3 个答案:

答案 0 :(得分:2)

我写了很多排行榜图书馆,可以帮助你。可立即使用的是python-leaderboard,它基于参考实现leaderboard ruby gem。使用Redis排序集,您的排行榜将实时排名,并且排行榜页面上有一个特定部分,其中包含用于在排行榜中同时插入大量成员的性能指标。如果您正在管道写入,您可以在大约30秒内对100万成员进行排名。

如果您担心数据实时更改,您可以在主从配置中操作Redis并让排行榜从从设备中提取数据,这只会定期从主设备轮询。

希望这有帮助!

答案 1 :(得分:1)

创建一个存储用户ID和用户分数的表。只需使用

拉出排行榜
ORDER BY user_score DESC 

并加入主表以获取用户名或您需要的任何其他内容。

除非测试总数是等式中的变量,否则每个用户的排名系统计算应保持不变,因此只需更新单个条目。

答案 2 :(得分:1)

您会欣赏Redis中sorted sets的概念。

不要错过描述问题的段落:D