私が維持するDjangoアプリケーションでは、ユーザーはログインし、フォーラムスタイルでメッセージを交換します。どの時点でも、最後の5分以内にsession
オブジェクトを記録した人をチェックすることで、オンラインにいる人を示します。これを達成するために、Djangoプラグインuser_sessionsを使用して、通常のORMのようなセッションを操作できます。セロリを使用してDjangoアプリケーションのタスクを非同期で実行する
これを実現するために私のコードは、このようです:
class WhoseOnlineView(ListView):
model = Session
template_name = "whose_online.html"
def get_queryset(self):
unique_user_sessions = Session.objects.filter(last_activity__gte=(timezone.now()-timedelta(minutes=5))).only('user').distinct('user')
users = [session.user for session in unique_user_sessions]
users = [user for user in users if user is not None] #sanitizing None values
return users
ウェブサイトのユーザー(と機能)が大幅に成長している、とnewrelicごとに、この特定のビューは、すべての中でほとんどの時間量を消費しています私の意見
私はこの全体のタスクを非同期的に実行する必要があると考えています。私はセカンダリ(メッセージブローカとしてredisを持つ)を稼動し、私のプロダクションサーバのスーパーバイザーの下で走っています。
これは、60秒に1回実行される定期的なタスクです。しかし、そのためには、をDB(またはキャッシュ)に保存する必要があるので、次回オンラインリストが処理されるまでユーザーは保存された結果を見ることができます。
これを達成する方法の例を教えてください。私が苦労している主なものは、次の定期的なタスクが開始される前に、ユーザーに表示される結果を保存(またはキャッシュ)する方法です。
ええ、私が使っているキャッシュバックエンドは 'django.core.cache.backends.locmem.LocMemCache'です。私は、キャッシュを正しく設定または取得できないことを除いて、すべてが期待通りに機能するようです。キャッシュが正しく設定されているかどうかをテストする方法はありますか?私は 'djangoデバッグツールバー'を試しました。それに応じて、キャッシュは呼び出されていません。 –
キャッシュについて私があなたに渡したリンクを見てください。すべてのキャッシュ装置を設定する方法と使用方法 – trinchet
それは私が使っているものです。正確には、この部分は:https://docs.djangoproject.com/en/1.9/topics/cache/#local-memory-cachingそれは非常にナンセンスなセットアップですので、私は私が何かを困惑しています行方不明 –