2016-10-24 40 views
0

到期我有這個在我的views.py自動緩存視圖在Django

@cache_page(60 * 5) 
def get_campaign_count(request): 
    return HttpResponse(
     json.dumps({ 
      'count': Campaign.objects.get_true_campaign_query().filter(dismissed=False).count() 
     }, 
      cls=DjangoJSONEncoder 
     ), 
     content_type='application/json') 

獲取計數需要一些時間(20-40秒)每次加載時間,所以我決定緩存增加它有5分鐘的到期時間。我的問題是,是否有可能告訴django在到期時自動重新緩存頁面?否則,另一個用戶在獲得響應之前必須等待20-40秒,之後其他用戶才能從緩存中獲益。

回答

1

沒有開箱即用的afaik。你最好的選擇是每隔5分鐘運行一個後臺任務(crontab中的django管理命令,或者芹菜),然後手動將這個值緩存在某個鍵下(過期時間設置爲永不過期),然後通過鍵在視圖中讀取它(不再有整個頁面緩存)。我認爲這是保持100%請求緩存並且不返回任何陳舊數據(大於5分鐘)的唯一方法。

如果您不介意在5分鐘過去後向第一位用戶顯示過時的數據,則可以將時間戳與高速緩存內的值一起存儲,以標記此緩存最後一次刷新的時間。這個時間戳然後可以用來手動檢查自上次刷新以來是否已經過去了5分鐘(這是爲了與不存在過期值的任何情況下不返回任何內容的memcached標準行爲進行對抗)。如果超過5分鐘,立即將陳舊的緩存值返回給用戶,併產生後臺線程以更新緩存的值。

+0

謝謝!我實際上正在考慮通過芹菜路線,因爲我已經使用芹菜來發送郵件了。 –