注:文中的客戶端指瀏覽器(瀏覽器快取)與快取伺服器,實際上快取伺服器是**伺服器的一種,在本文中將快取伺服器歸結至客戶端,服務端則指源伺服器。
乙個使用快取cache的站點會監聽客戶端向服務端發出的請求,並儲存服務端的回應——比如html頁面、等檔案。接著,如果再次使用相同url傳送請求,他能夠使用之前已經儲存下來的反饋檔案,而不是再次向服務端發出請求。
有兩個主要的理由讓人們使用快取:
快取分為瀏覽器快取(瀏覽器前進與後退功能的實現)和**快取。瀏覽器快取 caches
瀏覽器快取機制,其實主要就是http協議定義的快取機制。
瀏覽器快取機制主要有兩種策略:expires策略與cache-control策略。這兩種策略可以用來判斷快取的資源是否已經過期。
expires策略(忽略)
expires是web伺服器響應訊息中的頭字段,在響應http請求時告訴瀏覽器在過期時間前可以直接從瀏覽器快取或伺服器緩訪問資料,而無需再次請求。
expires響應頭包含日期/時間,即在此日期之後,響應過期。
示例:expires: wed, 21 oct 2015 07:28:00 gmt
通過比較expires和請求頭中date屬性的值,來判斷快取是否失效。
不過expires是http 1.0的東西,現在預設瀏覽器均預設使用http 1.1,所以它的作用基本忽略。
cache-control策略(重點關注)
cache-control與expires的作用一致,都是指明當前資源的有效期,控制瀏覽器是否直接從客戶端取資料或是重新發請求到服務端。只不過cache-control的選擇更多,設定更細緻,如果同時設定的話,其優先順序高於expires。
首先我們來看一下http協議頭cache-control中容易混淆的幾個部分:
快取請求(request header)指令:
快取響應(response header)指令 下面我們對上述所牽扯的一些欄位再做一些補充。關於有效性校驗(etag)在下文會進行說明。cache-control: no-cache
客戶端傳送請求中如果包含no cache指令,表示瀏覽器不會接受快取內容。客戶端的請求必須**給服務端。
服務端的響應中如果包含no cache指令,表示客戶端不能對資源進行快取。服務端也將不再對客戶端請求中提出的資源有效性進行確認。
cache-control: max-age=604800
客戶端傳送請求中包含max-age指令時,如果判定資源的快取時間比指定時間的數值小,那麼客戶端可以接受快取的資源。另外,如果指定max-age=0,那麼客戶端必須將請求**給服務端。
服務端的響應中包含max-age指令時,客戶端在指定的時間內將不對資源有效性再做確認,而max-age數值代表資源儲存為快取的最長時間。
重要的一點就是max-age代表的是相對時長而不是絕對時長,如下圖(截選自:http 快取):
上圖也展示了如何使用max-age進行資源是否過期的判斷。
cache-control: min-fresh=60
要求服務端返回還未過指定時間的快取資源。比如,當指定min-fresh=60後,過了60s的資源都無法作為響應返回。
cache-control: max-stale=3600
可指示快取資源,即使過期也照常接受。如果指令未指定任何引數,那麼無論經過多久,客戶端都會接受響應。如果指令中指定了具體數值,那麼即使資源過期,但只要處於max-stale指定時間內,仍然可以被客戶端接受。
cache-control: only-if-cached
last-modified與if-modified-since
last-modified:標示這個響應資源的最後修改時間。服務端在響應請求時,告訴客戶端資源的最後修改時間。
if-modified-since:使用if-modified-since頭將last-modified所標識的時間傳送至服務端。服務端收到請求後與被請求資源的最後修改時間進行比對。若最後修改時間較新,說明資源又被改動過,則響應整片資源內容,返回200;若最後修改時間較舊,說明資源沒有修改,則響應http304(無需包體,節省瀏覽,快取的頁面仍然有效),告知瀏覽器繼續使用所儲存的快取。
etag與if-none-match
etag:服務端響應請求時,告訴客戶端當前資源在服務端的唯一標識(生成規則由服務端決定)。apache中etag的值預設是對檔案的索引節(inode),大小(size)和最後修改時間(mtime)進行hash後得到的。
if-none-match:當資源過期時(使用cache-control標識的max-age),發現資源具有etag宣告,則再次向服務端請求時帶上頭if-none-match(儲存了etag的值)。服務端收到請求後發現有頭if-none-match 則與被請求資源的相應校驗串進行比對,決定返回200或304。
既生last-modified何生etag?
你可能會覺得使用last-modified已經足以讓瀏覽器知道本地快取的副本是否足夠新,為什麼還需要etag(實體標識)呢?http1.1中etag的出現主要是為了解決幾個last-modified比較難解決的問題:
**快取**快取就是我們所說的快取伺服器,它使用相同的原理,但卻有大得多的規模,**可以用相同的方法為幾百甚至幾千的使用者服務。**快取是共享快取的一種,不是只有乙個人正在使用它們,而是同時有大量的使用者,因此它們非常好的節約了頻寬和網頁延遲。
關於**快取的內容,可以參考web**與cdn快取,更詳細的內容我就不在這裡細說了。
所有的快取都有一整套工作機制,其中一些規則來自於http協議,另一些則來自管理員。
通常來說,它們有一些共有的規則:
header響應頭部分可以設定是否進行快取。html meta標籤tags vs http報頭headers我們可以在html檔案中的部分寫入tag標籤來描述該檔案的屬性。meta tags常常可以用來標籤檔案是否啟用快取和設定快取的過期時間。meta tags很容易使用,但是卻很沒效率。那是因為它們只對瀏覽器快取有用,而對快取伺服器無用(**從來不會讀取html檔案)。如果請求是經過http認證或是ssl安全鏈結, 快取無法工作。
如果符合以下條件,快取機制的啟用是通過頁面的重新整理引起:
熟悉cache-control策略;
熟悉http協議頭cache-control中常用字段的意義;
熟悉last-modified和etag的區別(這兩個也是進行快取驗證的方法);
掌握常用的http狀態碼含義。
快取cache詳解—付潭
http 通用首部字段—unitless
http 快取—mozilla mdn web docs
IOS 開發快取機制 記憶體快取機制
使用快取的目的是為了使用的應用程式能更快速的響應使用者輸入,是程式高效的執行。有時候我們需要將遠端 web伺服器獲取的資料快取起來,減少對同乙個 url多次請求。記憶體快取我們可以使用 sdk中的 nsurlcache類。nsurlrequest需要乙個快取引數來說明它請求的 url何如快取資料的,...
web WEB開發筆記
get 顯示伺服器資源 post 建立相關資源 delete 刪除相關資源 put patch 更新相關資源 retrofit retrofit newretrofit.builder baseurl addconverte ctory gsonconverte ctory.create build...
快取機制 全棧快取
1.配置檔案 cache middleware seconds 20 設定超時時間20秒 第一行和最後一行,位置不能放錯,只能放第一,和最後一行,又報錯是 modulenotfounderror no module named django.middleware.cache.updatecachem...