HTTP快取機制

2021-09-02 06:51:46 字數 2285 閱讀 8005

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?因...