http學習 http的快取控制

2022-09-20 14:21:14 字數 3319 閱讀 1651

由於請求-應答模式的通訊成本比較高,所以有必要將某些資料進行快取,從而節省頻寬。

快取是優化系統效能的重要手段,http 傳輸的每乙個環節中都可以有快取;

2.1 快取控制的流程

瀏覽器發現快取無資料,於是傳送請求,向伺服器獲取資源;

伺服器響應請求,返回資源,同時標記資源的有效期;

瀏覽器快取資源,等待下次重用。

舉個例子:

夏天到了,天氣很熱。你想吃西瓜消暑,於是開啟冰箱,但很不巧,冰箱是空的。不過沒事,現在物流很發達,給生鮮超市打個**,不一會兒,就給你送來乙個 8 斤的沙瓤大西瓜,上面還貼著標籤:「保鮮期 5 天」。好了,你把它放進冰箱,想吃的時候隨時拿出來。

2.2 伺服器使用「cache-control」設定快取策略

伺服器使用「cache-control」設定快取策略,常用的是「max-age」,表示資源的有效期;

瀏覽器收到資料就會存入快取,如果沒過期就可以直接使用,過期就要去伺服器驗證是否仍然可用;

不允許快取,用於某些變化非常頻繁的資料,例如秒殺頁面;

它的字面含義容易與 no-store 搞混,實際的意思並不是不允許快取,而是可以快取,但在使用之前必須要去伺服器驗證是否過期,是否有最新的版本;

又是乙個和 no-cache 相似的詞,它的意思是如果快取不過期就可以繼續使用,但過期了如果還想用就必須去伺服器驗證。

舉例說明一下:

no-store:買來的西瓜不允許放進冰箱,要麼立刻吃,要麼立刻扔掉;

no-cache:可以放進冰箱,但吃之前必須問超市有沒有更新鮮的,有就吃超市裡的;

must-revalidate:可以放進冰箱,保鮮期內可以吃,過期了就要問超市讓不讓吃。

如圖:其實不止伺服器可以發「cache-control」頭,瀏覽器也可以發「cache-control」,也就是說請求 - 應答的雙方都可以用這個字段進行快取控制,互相協商快取的使用策略。

重新整理

當你點「重新整理」按鈕的時候,瀏覽器會在請求頭裡加乙個「cache-control: max-age=0」。因為 max-age 是「生存時間」,max-age=0 的意思就是「我要乙個最最新鮮的西瓜」,而本地快取裡的資料至少儲存了幾秒鐘,所以瀏覽器就不會使用快取,而是向伺服器發請求。伺服器看到 max-age=0,也就會用乙個最新生成的報文回應瀏覽器。

ctrl+f5 的「強制重新整理」

強制重新整理是因為請求頭里的 if-modified-since 和 if-none-match 會被清空所以會返回最新資料

「前進」「後退」

這些重定向動作中瀏覽器不會「夾帶私貨」,只用最基本的請求頭,沒有「cache-control」,所以就會檢查快取,直接利用之前的資源,不再進行網路通訊。

4.1 條件請求

http 協議就定義了一系列「if」開頭的「條件請求」字段,專門用來檢查驗證資源是否過期。

驗證資源是否失效需要使用「條件請求」,常用的是「if-modified-since」和「if-none-match」,收到 304 就可以復用快取裡的資源;

驗證資源是否被修改的條件有兩個:「last-modified」和「etag」,需要伺服器預先在響應報文裡設定,搭配條件請求使用;

4.2 etag

etag是「實體標籤」(entity tag)的縮寫,是資源的乙個唯一標識,主要是用來解決修改時間無法準確區分檔案變化的問題。

etag的工作原理

etag在伺服器上生成後,客戶端通過if-match或者說if-none-match這個條件判斷請求來驗證資源是否修改。我們常見的是使用if-none-match。

請求乙個檔案的流程可能如下:

新的請求

客戶端發起http get請求乙個檔案(css ,image,js);伺服器處理請求,返回檔案內容和一堆header(包括etag,例如"2e681a-6-5d044840"),http頭狀態碼為為200

同乙個使用者第二次這個檔案的請求

客戶端在一次發起http get請求乙個檔案,注意這個時候客戶端同時傳送乙個if-none-match頭,這個頭中會包括上次這個檔案的etag(例如"2e681a- 6-5d044840"),這時伺服器判斷傳送過來的etag和自己計算出來的etag,因此if-none-match為fals,不返回200,返回304,客戶端繼續使用本地快取;

注意,伺服器又設定了cache-control:max-age和expires時,會同時使用,也就是說在完全匹配if-modified-since和if-none-match即檢查完修改時間和etag之後,伺服器才能返回304。

etag 還有「強」「弱」之分。

強 etag 要求資源在位元組級別必須完全相符,弱 etag 在值前有個「w/」標記,只要求資源在語義上沒有變化,但內部可能會有部分發生了改變(例如 html 裡的標籤順序調整,或者多了幾個空格)。

還是拿生鮮速遞做比喻最容易理解:

你打**給超市,「我這個西瓜是 3 天前買的,還有最新的嗎?」。超市看了一下庫存,說:「沒有啊,我這裡都是 3 天前的。」於是你就知道了,再讓超市送貨也沒用,還是吃冰箱裡的西瓜吧。這就是「if-modified-since」和「last-modified」。

第三次打**,你說「有不是 8 斤的沙瓤西瓜嗎?」,這回超市給了你滿意的答覆:「有個 10 斤的沙瓤西瓜」。於是,你就扔掉了冰箱裡的存貨,讓超市重新送了乙個新的大西瓜。這就是「if-none-match」和「強 etag」。

1、cache 和 cookie 都是伺服器發給客戶端並儲存的資料,你能比較一下兩者的異同嗎?

答:相同點:

都會儲存到瀏覽器中,並可以設定過期時間。

不同點:

cookie 會隨請求報文傳送到伺服器,而 cache 不會,但可能會攜帶 if-modified-since(儲存資源的最後修改時間)和 if-none-match(儲存資源唯一標識) 欄位來驗證資源是否過期。

cookie 在瀏覽器可以通過指令碼獲取(如果 cookie 沒有設定 httponly),cache 則無法在瀏覽器中獲取(出於安全原因)。

cookie 通過響應報文的 set-cookie 字段獲得,cache快取的是完整的報文。

用途不同。cookie 常用於身份識別,cache 則是由瀏覽器管理,用於節省頻寬和加快響應速度。

cookie的max-age是從客戶端收到報文開始計算,cache的則是從伺服器發出報文的時候開始計算.

cookie是方便進行身份識,cache是為了減少網路請求

HTTP的快取控制

1.快取的分類 1 快取分為服務端側 server side,比如 nginx apache 和客戶端側 client side,比如 web browser 2 服務端快取又分為 伺服器快取 和 反向 伺服器快取 也叫閘道器快取,比如 nginx反向 squid等 其實廣泛使用的 cdn 也是一種...

生鮮速遞 HTTP的快取控制

快取 cache 是計算機效能的乙個重要概念。由於鏈路漫長,網路時延不可控,瀏覽器使用 http 獲取資源的成本較高。所以,非常有必要把 來之不易 的資料快取起來,下次再請求的時候盡可能地復用。一 伺服器的快取控制 伺服器負責控制,瀏覽器負責快取 我們以生鮮速遞作為例子說一下。如果我現在想要吃乙個西...

HTTP學習筆記(一) HTTP快取機制

快取在應用開發中是乙個很重要的環節,利用好快取能夠有效地提公升使用者的體驗,加快使用者對資源的獲取效率。在http中,http定義了一套快取機制來指導客戶端對於資源的快取模式。在http中,快取的方式分為兩種 強快取和協商快取。他們的區別在於強快取不會向伺服器發起請求,只要快取資源沒有過期,就會直接...