瞭解HTTP 緩存

---------------------武漢加油,陝西加油,中國加油---------------2020-02-17----------------

重用已獲取的資源能夠有效的提升網站與應用的性能。Web 緩存能夠減少延遲與網絡阻塞, 進而減少顯示某個資源所用的時間。藉助 HTTP 緩存,Web 站點變得更具有響應性。
在這裏插入圖片描述

1.瀏覽器發起請求(攜帶 Cache-Control ),會先去本地緩存看看是否有緩存並且命中,假如有就直接返回緩存資源,反之則就轉向代理服務器;
2.代理服務器去查找相關的緩存設置,如 s-maxage,以及該資源是否有緩存,同樣的會去檢查是否命中緩存資源,假如有則會返回至本地緩存, 反之則到達源服務器;
3.到達源服務器後,源服務器會返回資源新文件,然後一步步返回。

這大概就是緩存最粗糙的一個基本流程,接下來我們來一步步的淺析緩存的原理。

Cache-Control
在這裏插入圖片描述

Cache-Control 緩存特性

我們一開始開到表格估計會嚇一跳,僅僅只是一個 Cache-Control 就幾乎有那麼多指令。但實際上我們把它分爲特性模塊來看,我們自然而然就會清晰很
多。

可緩存性

public:就是該 HTTP 請求所請求的內容,無論是經過代理服務器還是客戶端,都可以對該請求進行緩存操作;
private:只有發起請求的瀏覽器纔可以進行緩存,而代理服務器則不可以;
no-cache:這裏的意思是可以緩存,但是在緩存之前不管過沒過期,都需要向源服務器進行資源有效性校驗;

過期性

max-age:該緩存什麼時候到期;
s-maxage:在代理服務器中,如果我們同時設置了 max-age 以及 s- maxage,那麼代理服務器會讀取 s-maxage,因爲該指令是專門爲代理服務器而存在的;

重新驗證

must-revalidate:假如還沒到過期時間,那麼可以使用緩存資源;反之就必須到源服務器進行有效檢驗;
proxy-revalidate:同 must-revalidate,只是 proxy-revalidate 用在緩存服務器;

Expires

除了 Cache-Control 可以控制資源的緩存狀態之外,還有 Expires,它是HTTP 1.0 的產物,但是還是有很多地方會有到它。它跟 Cache-Control 中的max-age 有什麼區別呢?

表達方式:Expires 是絕對時間,如 Expires: Tue Jul 09 2019 23:13:28 GMT+0800,而 max-age 是相對時間,如 max-age=3600;
協議版本:Expires 是 HTTP 1.0 版本的首部字段,而 max-age 是HTTP 1.1 版本及其之後的首部字段;
優先級:當請求協議版本爲 HTTP 1.0 時,同時存在 Expires 和 max- age 會無視 max-age,而當請求協議版本爲 HTTP 1.1 則會優先處理max-age 指令;

除此之外,它們的使用方法時一樣的,因此我們就不再實戰演示了,它們都是用來校驗強緩存的標識。

緩存校驗 Last-Modified & ETag

Last-Modified

顧名思義,上次修改時間。主要配合 If-Modified-Since 或者 If-Unmodified-Sice。

基本流程:

1.首次請求資源,服務器返回資源時帶上實體首部字段 Last-Modified;
2.當我們再次請求該資源時,瀏覽器會自動在請求頭帶上首部字段 If- Modified-Since,此時的 If-Modified-Since 等於 Last-Modified ;
3.服務器接收到請求後,會根據 If-Modified-Since 配合 Last-Modified 來判斷資源在該日期之後是否發生過變化;
4.如果發生修改了,則返回新的資源並返回新的 Last-Modified,反之則返回狀態碼 304 Not Modified,這個過程稱爲協商緩存。

ETag

相對於 Last-Modified,ETag 是一個更加嚴格的驗證,它主要是通過數字簽名表示資源的唯一性,但當該資源發生修改,那麼該簽名也會隨之變化,但是無論如何都會保證它的唯一性。所以根據它的唯一性,就可以 If-Match 或者If-Non-Match 知道資源有沒有發生修改。

基礎流程: 同 Last-Modified,只是把 Last-Modified 換成 ETag, If- Modified-Since 換成 If-Match 。但是假如 Last-Modified 以及 ETag 同時存在,則後者 ETag 的優先級比較高。

強緩存 & 協商緩存

在進行最後一個實戰模擬之前,要先說下這兩個十分重要的概念:強緩存以及協商緩存。

強緩存

簡單粗暴來講,就是
客戶端知道資源過期時間後,由客戶端來決定要不要緩存。
那麼怎麼知道資源的過期時間呢?由誰來決定它們的過期時間呢?就是由我們上文提到的 Expires 以及 Cache-Control: max-age。

協商緩存

跟強緩存相反,是由服務器來決定客戶端要不要使用緩存。在有 ETag 以及Last-Modified 響應首部字段的情況下,客戶端會向服務器發起資源的緩存校驗,然後服務器會告知客戶端是使用緩存(304)還是返回一個全新的資源,表面上看都是會發起一個請求,但是響應的時候則是不是一個完整的響應則看是否需要緩存。

還記得 Cache-Control 的指令 no-cache 和 no-store 嗎?這時候應該就清楚了兩者的區別了。no-cache 就是直接跳過強緩存進入協商緩存。而 no-store 則是不緩存,效果等同於 Chrome 瀏覽器的 Disable Cache,仔細觀察,你會發現請求首部字段是不會攜帶關於緩存的任何首部字段。

總結

這下總算知道爲什麼有時候 Chrome 瀏覽器會展示 disk cache/memory cache 了吧,它跟 304 Not Modified 同樣都是被緩存的意思,這是方式不一樣。由此可見,合理的使用緩存是多麼的重要,它可以使我們減少無所謂的請求、避免資源文件的重複傳輸、減少對源服務器的資源佔用等等好處,但也不能濫用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章