1

私の見解では、私は次のことを持っています

@require_POST
def loadVals(request):
  result = //do some heavy calculations
  return HttpResponse(json.dumps({"data": result}), content_type="application/json")

「重い計算」を常に実行する必要がないように、キャッシュを追加しました。したがって、新しいコードは次のようになります

設定.py

CACHES = {
'default': {
    'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    'LOCATION': 'unique-snowflake'
}

}

ビュー.py

from django.core.cache import get_cache

@require_POST
def loadVals(request):
  cache = get_cache('default')
  result = cache.get('res')
  if result == NONE:
    result = //do some heavy calculations
    cache.set('res', result, 30)
    return HttpResponse(json.dumps({"data": result}), content_type="application/json")
  else:
    return HttpResponse(json.dumps({"data": result}), content_type="application/json") 

代わりにやりたいことは、そのキャッシュの有効期限が切れた場合でも、フロント エンド ユーザーの待機時間を節約し (計算が重いため)、最後に期限切れになった値を返すことです。そして、キャッシュを更新します。

どうすれば

1) 期限切れのキャッシュの値を取得しますか? キャッシュの有効期限が切れている場合、cache.get('res') は NONE を返すため

2) return HttpResponse ステートメントの後に呼び出しを行って、キャッシュ値を更新し、大量の計算を行います (return statmenet が期限切れの値を返したところ) または、非同期呼び出しを介してこれを行うことができますか?

4

2 に答える 2

2

まず、コードに構文上の問題があります。次に、django キャッシュから期限切れの値を取得できません。期限切れの値は、期限切れになると削除されます。

この種のケースで期限切れの値をより長く保存したい場合は、それらをデータベースのようなより永続的なストレージに保存する必要がありますが、そのためのキャッシュは作成されません。

または、結果を 2 回キャッシュし、そのうちの 1 つを長くして、2 番目のキャッシュから提供することもできます。

from django.core.cache import get_cache

@require_POST
def loadVals(request):
    cache = get_cache('default')
    result = cache.get('res') or cache.get('res_long')
    if result is None:
        result = //do some heavy calculations
        cache.set('res', result, 30)
        cache.set('res_long', result, 60*60*24*7) # cache for a week
    return HttpResponse(json.dumps({"data": result}), content_type="application/json")

ショート キャッシュを再キャッシュするために何かを行う必要があるため、これはまだ優れたアプローチではありません。また、キャッシュバックエンドを二重のデータでオーバーロードするため、あまり良くありません。

ユーザーに常にキャッシュされたコンテンツを取得させたい場合は、たとえばCeleryを使用してバックグラウンド タスクでコンテンツをキャッシュしてみてください。

于 2013-03-21T15:08:18.460 に答える
-1

これが私のために働いたものです:

1) グローバル変数を作成し、キャッシュを設定するときに、このグローバル変数も設定します。キャッシュの有効期限が切れている場合、グローバル変数には期限切れの値が残っているため、応答として送信してください。スレッドを使用してキャッシュとグローバル変数を更新します。

2) Python スレッドを使用する

import  threading
def loadVals():
    threading.Thread(group=None, target=methodToDoheavyCalculations).start()
    # return the expired cache in the meanwhile
    return HttpResponse(json.dumps(EXPIRED_VALUES), content_type="application/json")
于 2013-03-21T17:21:34.423 に答える