http快取機制定義在http協議標準中,被現代瀏覽器廣泛支援,同時也是乙個用於提公升基於web的系統效能的廣泛使用的工具。
與快取相關的資訊儲存在http報文的header中。
http快取主要涉及三個角色:一是瀏覽器,二是瀏覽器的快取資料庫,三是伺服器。
當瀏覽器首次發出請求時:
當瀏覽器再次執行同一請求時,會根據不同的快取型別執行不同行為。
原理:
所請求的資料在快取資料庫中尚未過期時,不與伺服器進行互動,直接使用快取資料庫中的資料。過期則會重新返回資料及快取規則(與首次請求類似)
快取未過期時:
快取過期時:
過期時間
expire
指定了乙個時間, 在這個時間之後,http響應被認為是過時的。
但是它本身是乙個http1.0標準下的字段,所以如果請求中還有乙個置了 「max-age」 或者 「s-max-age」 指令的cache-control響應頭,那麼 expires 頭就會被忽略。
cache-control
用於在http 請求和響應中指定快取機制。
常用的幾個取值有:
private:客戶端可以快取
public:客戶端和**伺服器都可以快取
max-age=***:快取的內容將在*** 秒後失效
s-max-age=***:同s-max-age,但僅適用於共享快取(比如各個**),並且私有快取中忽略。
no-cache:需要使用協商快取來驗證快取資料
no-store:所有內容都不會快取,強快取和協商快取都不會觸發
must-revalidate:快取必須在使用之前驗證舊資源的狀態,並且不可使用過期資源。
當強快取未命中或者cache-control中有must-revalidate標識必須每次請求驗證資源的狀態時,便使用協商快取的方式去處理快取檔案。
原理
從快取資料庫中取出快取的標識,然後向瀏覽器傳送請求驗證請求的資料是否已經更新,如果已更新則返回新的資料,若未更新則返回304狀態碼,通知客戶端繼續使用快取資料庫中的快取資料。
快取未更新時
快取已更新時
如何判斷資源是否修改過
與協商快取相關的幾個header欄位:
請求頭:if-none-match、if-modified-since
if-none-match用於通知伺服器客戶端快取的唯一標識,if-modified-since用於通知伺服器在上一次請求中返回的資源的最後修改時間。
響應頭:etag、last-modified
etag是所請求的資料在伺服器中的唯一標識,last-modifind是伺服器響應時用來告訴瀏覽器資源最近的修改時間。
(1)對比etag和if-none-match(優先順序高於對比last-modified和if-modified-since)
伺服器收到請求後發現有頭if-none-match ,則與etag進行比對,
不同,說明資源又被改動過,則響應整個新的資源內容,返回狀態碼200;
相同,說明資源無新修改,則響應http 304,告知瀏覽器繼續使用所儲存的cache。
(2)對比last-modified和if-modified-since
如果請求欄位中沒有if-none-match就會使用這種方式判斷。
伺服器收到請求後發現有頭if-modified-since ,則與last-modified進行比對。
若資源的最後修改時間大於if-modified-since,說明資源又被改動過,則響應整個新的資源內容,返回狀態碼200;
若資源的最後修改時間小於或等於if-modified-since,說明資源無新修改,則響應http 304,告知瀏覽器繼續使用所儲存的cache。
Http快取機制
快取快取,就是把需要的東西存起來,不需要每次都去請求。主要目的減小伺服器壓力,放到客戶端上來講,還利於節省流量,還能流暢的把ui顯示出來,提高了使用者體驗。對於http快取來講,主要的就是校驗快取的有效性,也就是新鮮度。如果客戶端不能及時響應服務端的資料變化,快取一直不能被更新,那不就是得不償失了?...
HTTP 快取機制
基於 header的示例 content length 3534http快取策略分為 1 快取策略 cache control 頭里的 public private no cache max age no store 其中no store為不儲存,no cache 0秒的max age 2 快取過期...
http快取機制
首先需要了解http協議的響應頭中的幾個欄位的含義 cache control expires 該欄位表示資源的過期時間。etag 該欄位表示資源的唯一標識。last modified 該欄位表示資源的最後修改時間。有以下2個問題需要注意 為什麼優先校驗etag,後校驗last modified?因...