2017-06-15 151 views
0

比方說,我必須提供我的網站,可以隨時更新動態內容。我想要緩存數據以獲得最佳性能。如何設置Cache-Control標題以緩存動態內容?

我認爲最準確的做法是隻要數據沒有改變就將數據保存在緩存中。所以它涉及到使用no-cache選項。

問題是我不知道這是否是一個不錯的選擇。每次有人請求這些數據時,緩存服務器都會請求原始服務器,並詢問自那時起數據是否已更改。所以我不知道no-store選項的差別在哪裏,數據根本沒有被緩存(就性能而言)。我的意思是,我認爲bandwitdh卷將用相當的方式相當(我是對吧?)

因此,如果每個單一時間的請求,我的緩存服務器必須檢查源服務器,所以什麼是與直接請求源服務器的區別?

是否有任何選項可以設置緩存,以便只在發生更新時才能獲取新數據?

回答

0

ETags是一種方法。如果你可以用你的動態內容的合理的短,唯一的字符串相關聯,那麼你可以使用該標識在HTTP響應頭:

Cache-Control: public, must-revalidate, max-age=60 
ETag: <content identifer> 

這是很重要的內容標識符,從而例如使用改變其內容的變化,內容的十六進制編碼哈希將工作。隨後,客戶端將通過一個GET請求發送的In-None-Match頭使用的ETag:

If-None-Match: <previous etag> 

服務器應該發送304未修改響應,如果內容的ETag的沒有改變,或發送一個完整200 OK的反應與更新的內容和一個新的ETag,否則。

支持服務器上的If-Modified-Since標題的另一選項。此標頭允許客戶端僅在指定日期之後修改內容時才請求內容,否則服務器應返回304 Not Modified響應而沒有內容。

+0

感謝這就是我一直在尋找。你認爲這些解決方案能否給我帶來與製作「基本緩存」相同的優勢,還是會使用一些額外的bandwitdh? – Jack

+0

頭允許瀏覽器管理自己的緩存,你不應該需要任何東西。發送的HEAD請求的開銷很小,以檢查內容是否仍然有效,但這些都是最小的,並且可能是新內容下載時總帶寬的一小部分。你可以通過調整'Cache-Control'頭部來修改客戶端檢查更新的頻率 - 例如在'最大年齡= 60'選項說的內容被視爲新的5分鐘 - 見https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control了更多的選擇。 –

+0

請注意,大多數HTTP客戶端在發送完整的GET請求之前不會發送HEAD請求,因爲它具有已知的資源實體標記。它只會發送帶有'If-None-Match'頭部的GET。 – idbehold