3

djangoで書かれたウェブサイトがあります。サイトには、ポイントとポイントに応じたランクを持つユーザーがいます。

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

ユーザーがポイントを獲得すると、自分のランクが変更され、他のユーザーも変更されます。問題は、ユーザーのランクを計算するための最良の方法は何ですか、いつ計算する必要があるか、またはどのくらいの頻度で計算する必要があるかです。

ありがとう。

4

1 に答える 1

2

おそらく、1人のユーザーのポイントが増えるたびにすべてのユーザーのランクを更新するための最良のアプローチではありません。多くのユーザーがいる場合、これはバックエンドで厳しいものになります。

たとえばプロフィールページでユーザーのランクを表示したい場合は、ポイント順に並べられたすべてのユーザーのリストを取得するクエリを作成し、これを辞書などとして個別に保存して、大量にキャッシュすることができます。これはパフォーマンスに優れています。

したがって、ユーザーリストが次のようになっているとします(1111などがusersidです)。

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を返します

追加のDBクエリは必要ありません

小さなサイトだけであれば、毎回ユーザーリストを取得し、そのリスト内の現在のユーザーの位置を見つけることに害はありません。

ただし、数千人のユーザーを期待している場合は、上記の方が適切なアプローチになる可能性があります。

編集:以下のコメントで説明されているように、毎回リストを並べ替えると大量のメモリを消費する可能性があるため、並べ替えられたリストもキャッシュする必要があります

于 2012-11-09T10:46:48.437 に答える