2015-12-16 172 views
1

我剛剛在我的web應用程序中啓用了Django的每站點緩存(使用Redis作爲我的緩存後端)並立即遇到問題。我的網站包含顯示用戶照片及其個人簡歷的用戶個人資料頁面。我也有一個表格,允許他們改變他們的照片和/或生物。如果用戶上傳新照片,我會爲該照片創建一個新的唯一名稱。正如您所期望的那樣,當用戶轉到該表單並上傳新照片時,我會重新顯示他們的個人資料頁面,以便他們可以在提交新照片或個人簡歷之前對其進行查看,該頁面會顯示他們的舊照片,啓用站點緩存。我是否可以禁用特定視圖的緩存(即針對此類情況),還是必須禁用每站點緩存並在逐個視圖的基礎上實施緩存?這是我第一次使用緩存,我不知道我應該採取什麼方法。我有另一個視圖/模板,顯示當前登錄的所有用戶,我預計在那裏會出現同樣的問題,即他們的舊​​照片將在他們更改後繼續顯示。我不應該使用Django每站點緩存嗎?

感謝您的建議。

+0

以下是一般性建議:使用適合大多數情況的方法,然後在需要的地方特別啓用/禁用(取決於方法)。您也可以遵循「緩存失效」策略,某些操作會清除某些緩存。 –

+0

我想我不明白的是,啓用緩存後,如果用戶轉到他們的「更改個人資料」表單頁面,更改他們的個人資料,提交表單,並重新呈現表單以顯示新的生物內容,爲什麼沒有在表單頁面上顯示內容?頁面內容確實發生了變化,爲什麼Django會重新呈現之前的表單/頁面?它不應該看到頁面的內容發生了變化,因此不能從緩存中獲取頁面嗎?謝謝。 – William

+0

在Django文檔中,它看起來像修改頁面不會使緩存無效。總是有一個moneypatching策略,根據最後一次修改'/ profile?whatever = timestampstring'使用查詢,這很醜陋,我知道。 –

回答

0

自從我昨天發佈這個問題以來,我一直在進行大量閱讀,我將分享我學到的東西。這些是我的印象你應該如何處理基於我讀過的緩存,而不是任何我的經驗。因此,我可能會遇到一些錯誤。

首先,您不應該將緩存作爲性能的靈丹妙藥,特別是如果您不知道自己在做什麼。緩存爲您的堆棧增加了更多的複雜性,它創造了另一個失敗點,顯然它有時會導致難以排除故障的奇怪問題。除非你知道如何衡量你的網站的性能,做了一些分析,並且事實證明你有性能問題,否則你最好不要進行緩存。從我讀過的內容來看,在嘗試通過Django進行緩存之前,您最好專注於優化數據庫查詢並儘量減少頁面權重。如果您希望在該蝙蝠身上執行任何緩存,請查看通過您的Web服務器(Apache,Nginx等)緩存圖像,樣式表和JavaScript。

關於我的問題,我想我對緩存的工作原理有錯誤的看法。當我在Django中啓用「per-site」緩存時,我認爲我對Django說的是「將每個頁面請求的每個響應存儲在Redis緩存中,直到緩存填滿並開始驅逐事物。」如果請求頁面並且該頁面仍在緩存中,則緩存不會奇蹟般地知道該頁面是否已更改,然後獲取更新後的版本(如果有)。無論改變多少次,它都會繼續返回緩存頁面(除非它被驅逐)。

我所做的只是做一個測試,將@never_cache修飾器應用於有問題的視圖。這解決了我遇到的問題。但是,正如洛倫佐所暗示的,在個案基礎上應用緩存可能是更好的方法。如果你想緩存一個特定的視圖,請使用@cache_page修飾器。如果要緩存模板的一部分,請使用{%cache%}。通過Django的低級API「django.core.cache.caches」緩存實際數據,這些數據很昂貴。如果您想基於緩存過期和/或驗證進行緩存,請通過@condition修飾器使用Django的「條件視圖處理」功能。

如果您完全不熟悉緩存,我強烈建議您閱讀Mark Nottingham的Caching Tutorial和Ryan Tomayko的Things Caches Do

我希望這有助於!

相關問題