自從我昨天發佈這個問題以來,我一直在進行大量閱讀,我將分享我學到的東西。這些是我的印象你應該如何處理基於我讀過的緩存,而不是任何我的經驗。因此,我可能會遇到一些錯誤。
首先,您不應該將緩存作爲性能的靈丹妙藥,特別是如果您不知道自己在做什麼。緩存爲您的堆棧增加了更多的複雜性,它創造了另一個失敗點,顯然它有時會導致難以排除故障的奇怪問題。除非你知道如何衡量你的網站的性能,做了一些分析,並且事實證明你有性能問題,否則你最好不要進行緩存。從我讀過的內容來看,在嘗試通過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。
我希望這有助於!
以下是一般性建議:使用適合大多數情況的方法,然後在需要的地方特別啓用/禁用(取決於方法)。您也可以遵循「緩存失效」策略,某些操作會清除某些緩存。 –
我想我不明白的是,啓用緩存後,如果用戶轉到他們的「更改個人資料」表單頁面,更改他們的個人資料,提交表單,並重新呈現表單以顯示新的生物內容,爲什麼沒有在表單頁面上顯示內容?頁面內容確實發生了變化,爲什麼Django會重新呈現之前的表單/頁面?它不應該看到頁面的內容發生了變化,因此不能從緩存中獲取頁面嗎?謝謝。 – William
在Django文檔中,它看起來像修改頁面不會使緩存無效。總是有一個moneypatching策略,根據最後一次修改'/ profile?whatever = timestampstring'使用查詢,這很醜陋,我知道。 –