2014-10-16 70 views
3

在由史蒂夫Souders的(at around 14:30)演示"Cache is King",它暗示有在實踐中,只有你應該爲你的資源使用兩個緩存持續時間:「永遠」和「從不」(我自己的術語)。「永遠」和「永不」是唯一有用的緩存持續時間嗎?

  • 「永遠」意味着您通過設置非常高的最大年齡(例如一年)有效地使資源永久不變。如果您想在某些時候修改資源,演示文稿建議您只需在另一個URL上發佈修改後的資源。 (建議在此重命名是必要的,部分或全部,因爲大量在互聯網上錯誤配置的代理。)
  • 「從不」意味着你有效地禁止一切形式的緩存,並且需要瀏覽器下載資源每次請求。

一方面,Google首席績效工程師給出的任何績效建議都會自行承擔責任。另一方面,由於某種原因(不僅僅是「永遠」和「從不」)將HTTP緩存設計爲可變緩存持續時間,並且僅僅因爲資源已被修改而將URL更改爲資源似乎違背了HTTP。

有「永遠」和「never」中的唯一高速緩存持續時間,你應該在實踐中運用?這是否與網絡上的其他最佳做法相沖突?

除了典型的「帶瀏覽器的用戶」用例外,我還想知道這些原則是如何應用於REST /超媒體API的。

+0

我最喜歡的緩存標頭是'Cache-Control:private,max-age = 0',它可以選擇性地與'ETag'組合成等於資源哈希或資源版本。它在使用Ajax或RESTful API的情況下獲得最佳結果。例如,請參閱[答案](http://stackoverflow.com/a/9269567/315935)。 – Oleg 2014-10-18 21:21:01

回答

4

許多人不同意將自己限制爲「永遠」或「永遠」不如你描述的那樣。

首先,它忽略了允許緩存始終重新驗證的選項。在這種情況下,如果客戶端(或代理)緩存了資源,它將發送一個有條件的HTTP請求。如果客戶端/代理緩存了最新版本的資源,則服務器發送一個短的304響應而不是整個資源。如果客戶端(代理)副本已過期,則服務器將發送整個資源。

有了這個計劃,客戶總是會得到資源的了最新版本,如果資源沒有改變多少帶寬將被保存。

爲了節省更多的帶寬,客戶端可以被指示重新驗證,只有當資源超過一定的時間段之前。

而且如果壞代理是一個問題,服務器可以指定只有客戶端而不是代理可以緩存資源。

我發現this document非常簡潔地描述了您的緩存選項。 This page更長,但也提供了一些優秀的信息。

+0

如果因爲等待時間而被修改爲壞。 – 2014-10-24 00:10:04

+0

在避免延遲和提供陳舊數據的瀏覽器緩存之間進行權衡。如果內容很少發生變化,或者提供的陳舊數據沒有問題,那麼每月只能重新驗證一次或更長時間。 – 2014-10-24 00:17:39

2

「這取決於」真的,在你的用例,你試圖達到的目標以及你的品牌建議。

如果您只想實現一些帶寬節省,則可以進行總成本細分。服務成本可能不會太高。例如,瀏覽器在優化圖像點擊率方面非常聰明,因此瞭解您的HTTP協議。永遠,結合版本化的資源url和url重寫規則可能是一個很好的選擇,就像你的Google工程師建議的那樣。

資源的波動性是另一回事。例如,如果您僅提供每日股票圖表,它可以安全地緩存一段時間,但不是永遠。

您的計算成本很高嗎?您的用戶是否對時間敏感?數據是否存在或修復?例如,您可能正在爲航空公司航線,颶風路徑,選擇希臘航線或向首席運營官報告商務智能報告。您可能希望將其緩存,但TTL可能因用戶類而異,一直到永遠。永遠不能爲實時數據工作,但永遠也不會是錯誤的答案。

服務器和客戶端之間的合作程度可能是另一個因素。例如,在一個業務操作環境中,可以分發程序並預期遵循程序,再次查看TTL可能是值得的。

HTH。我懷疑是否有一個神奇的答案。

0

Idealy,你會緩存內容直到內容發生變化,如果因任何原因無法在內容更改時清除/刷新緩存,則需要一個持續時間。但的確,如果可以的話,永遠緩存或不緩存。如果您已經不知道任何變化,則無需刷新。

0

如果您知道底層數據在任何時間長度內都是靜態的,緩存是有意義的。我們有一個Web服務,用於從外部源夜間ETL作業填充的數據庫中公開數據。我們的RESTful Web服務只在數據庫發生更改時纔會發送到數據庫。在我們的例子中,我們確切知道數據何時發生變化,並在ETL過程完成後立即使緩存失效。