摸魚前端的自檢(五)深入HTTP快取機制及原理

2021-09-29 15:51:48 字數 1873 閱讀 5207

身為乙個web開發者,必要的http快取機制還是要去深入了解,因為在這上面可以做很多的web效能優化。要想成為乙個好的架構師,這一環節必不可少。

有興趣的同學可以去我的github,裡面有我的分享的學習過程和blog.

因為快取機制要用到報文,所以這裡簡單介紹下http報文。

現在廣泛的應用還是http1.1,http1.0已經很少見了。http協議互動的資訊被稱為http報文。http報文由報文首部、空行(cr+lf)、報文主體。http報文分為請求報文、響應報文。

報文資訊主要分為兩個部分:

這裡談的快取,主要是瀏覽器快取。至於伺服器快取(redis之類的)的就不談了,不在關聯範圍。

瀏覽器是乙個主體,乙個程式。所以它擁有分配的資源,有存放快取的資源地帶。

正常的首先第一次訪問**的時候,所以先向伺服器請求資源,然後客戶端拿到,然後存入瀏覽器快取地帶。

接下來我們可以把瀏覽器的快取分為強快取和協商快取兩種。

強快取強快取是屬於不需要訪問伺服器,直接從瀏覽器快取裡面拿資料,呈現給客戶端。

我們知道,在沒有快取資料的時候,瀏覽器向伺服器請求資料時,伺服器會將資料和快取規則一併返回,快取規則資訊包含在響應header中。對於強快取來說在header中有兩個欄位expires和cache-control,**其中expires 是http 1.0的東西,現在預設瀏覽器均預設使用http 1.1,所以它的作用基本忽略。**所以我們主要談cache-control。

cache-control(主要幾個,可以同時存在多個引數,例如:max-age = 60,public)

舉個例子,如果http請求頭帶了cache-control:max-age=60,也就是說在60秒之內再次請求這個資源,直接使用強快取,從瀏覽器取。

強快取命中的時候,network狀態碼是200(from cache)

協商快取

也就是說需要和伺服器協商之後,再判斷需要從瀏覽器拿快取不。

同樣的在第一次傳送請求之後,伺服器會把一些特定的標識字段返回給客戶端,然後客戶端交給瀏覽器快取起來。當再次請求的時候,客戶端將存下來的標識字段通過請求傳送給服務端,如果匹配成功,伺服器返回304狀態碼,通知客戶端比較成功,可以從瀏覽器拿快取資料。(下面畫了兩個圖來理解兩次傳送)

第一次傳送:

第二次傳送:

標識字段一共有兩種:

上面我們說到,第一次訪問的時候,伺服器會傳送快取標誌給客戶端,就是last-modified、etag。客戶端拿到後把他們存入瀏覽器快取,下次訪問的時候通過if-modified-since和if-none-match兩個字段傳送過去,內容和接收到的是相同的。if-modified-since = last-modified;if-none-match = etag

last-modified :伺服器返回的資源最後修改時間。

etag : 當前資源在伺服器的唯一標識(規則由伺服器決定)。

對比總結

對於強制快取,伺服器通知瀏覽器乙個快取時間,在快取時間內,下次請求,直接用快取,不在時間內,執行協商快取策略。

對於協商快取,將快取資訊中的etag和last-modified通過請求傳送給伺服器,由伺服器校驗,返回304狀態碼時,瀏覽器直接使用快取。同時etag的優先順序要高於last-modified。

在第二次訪問的時候,是先判斷是否有強快取,然後再判斷協商快取。具體可以看下面的圖:

前端也要懂Http快取機制

最近在看面試題的時候總會看到有一些關於http快取的題目,但是總是一知半解,不甚理解 尤其是http頭資訊中有一大堆的字段,什麼if modified since,什麼if none match,真是令人頭疼。後來突然想到,要是能通過自己構建乙個伺服器,自己新增頭資訊,然後看實現的效果,不就更好了麼...

深入了解一下HTTP快取機制

http 快取機制作為 web 效能優化的重要手段,是web 開發知識體系庫中的乙個基礎環節,但是對於很多學習者來說,僅僅只是知道瀏覽器會對請求的靜態檔案進行快取,但是為什麼被快取,快取是怎樣生效的,卻並不是很清楚。在此,用簡單明瞭的文字介紹http快取機制,期望對各位學習者正確的理解前端快取有所幫...

前端快取機制的總結

快取就相當於是對資源的一種副本實現,不管是在客戶端還是在服務端儲存著,用相同的url進行請求,直接從副本中請求資源而不再訪問源伺服器。快取種類很多,像是瀏覽器快取,cdn快取等都是我們比較熟悉的,當然還有 伺服器快取,閘道器快取等,這裡我主要介紹一下前兩種。乙個頁面的快取狀態可以通過這兩種方法去設定...