5分鐘看懂系列:HTTP緩存機制詳解

来源:https://www.cnblogs.com/cooffeeli/archive/2020/02/24/HTTP_Cache.html
-Advertisement-
Play Games

原創文章首發於公眾號:「碼農富哥」,歡迎收藏和關註,如轉載請註明出處! 什麼是HTTP緩存 HTTP 緩存可以說是HTTP性能優化中簡單高效的一種優化方式了,緩存是一種保存資源副本併在下次請求時直接使用該副本的技術,當 web 緩存發現請求的資源已經被存儲,它會攔截請求,返回該資源的拷貝,而不會去源 ...


原創文章首發於公眾號:「碼農富哥」,歡迎收藏和關註,如轉載請註明出處!

什麼是HTTP緩存

HTTP 緩存可以說是HTTP性能優化中簡單高效的一種優化方式了,緩存是一種保存資源副本併在下次請求時直接使用該副本的技術,當 web 緩存發現請求的資源已經被存儲,它會攔截請求,返回該資源的拷貝,而不會去源伺服器重新下載。
一個優秀的緩存策略可以縮短網頁請求資源的距離,減少延遲,節省網路流量,並且由於緩存文件可以重覆利用,降低網路負荷,提高客戶端響應。
所以,學會利用HTTP緩存是很有必要的
在此,我會向大家系統的介紹HTTP緩存機制,期望對各位正確的理解HTTP緩存有所幫助。

緩存策略

在闡述HTTP不同緩存策略之前,我們需要知道用戶刷新/訪問行為 的手段分成三類:

  • 在URI輸入欄中輸入然後回車/通過書簽訪問
  • F5/點擊工具欄中的刷新按鈕/右鍵菜單重新載入
  • Ctl+F5 (完全不使用HTTP緩存)

不同的刷新手段,會導致瀏覽器使用不同的緩存策略,我們下麵會分析到

HTTP 緩存主要是通過請求和響應報文頭中的對應 Header 信息,來控制緩存的策略。
響應頭中相關欄位為Expires、Cache-Control、Last-Modified、Etag。

HTTP緩存的類型很多,根據是否需要重新向伺服器發起請求來分類包括兩種:強制緩存對比緩存
假設瀏覽器有一個緩存資料庫用於本地緩存,先看看瀏覽器請求資源的情況:

瀏覽器第一次請求資源
強制緩存:
在瀏覽器已經緩存數據的情況下,使用強制緩存去請求數據的流程是這樣的:

強制緩存

強制緩存
從流程圖可以看到,強制緩存,在緩存數據未失效的情況下,可以直接使用緩存數據,不需要再請求伺服器,那麼瀏覽器是如何判斷緩存數據是否失效呢?
對於強制緩存來說,響應header中會有兩個欄位來標明失效規則(Expires/Cache-Control):

  • Expires:
    Expires是HTTP1.0的產物了,現在預設瀏覽器均預設使用HTTP 1.1,所以它的作用基本忽略。但是很多網站還是對它做了相容。它的值為服務端返回的到期時間,即下一次請求時,請求時間小於服務端返回的到期時間,直接使用緩存數據。
    但有一個問題是到期時間是由服務端生成的,如果客戶端時間跟伺服器時間不一致,這就會導致緩存命中的誤差。
    在HTTP 1.1 的版本,Expires被Cache-Control替代。
  • Cache-Control:
    Cache-Control是最重要的規則。常見的取值有private、public、no-cache、max-age,no-store,預設為private。

    (1) max-age:用來設置資源(representations)可以被緩存多長時間,單位為秒;
    (2) s-maxage:和max-age是一樣的,不過它只針對代理伺服器緩存而言;
    (3)public:指示響應可被任何緩存區緩存;
    (4)private:只能針對個人用戶,而不能被代理伺服器緩存;
    (5)no-cache:強制客戶端直接向伺服器發送請求,也就是說每次請求都必須向伺服器發送。伺服器接收到 請求,然後判斷資源是否變更,是則返回新內容,否則返回304,未變更。這個很容易讓人產生誤解,使人誤 以為是響應不被緩存。實際上Cache-Control: no-cache是會被緩存的,只不過每次在向客戶端(瀏覽器)提供響應數據時,緩存都要向伺服器評估緩存響應的有效性。
    (6)no-store:禁止一切緩存(這個才是響應不被緩存的意思)。

舉個例子:
比如一個資源響應頭是:

cache-control: public, max-age=31536000

那麼這個資源會被緩存31536000秒(365天),在365天內再次請求這條數據,都會直接獲取緩存資料庫中的數據,直接使用。
那麼我們試試再次訪問資源,會有以下的響應:
image

可以看到HTTP狀態碼是200,Size這個欄位顯示:disk cache,說明HTTP響應報文大小是0,瀏覽器確實走了強制緩存,沒有再跟瀏覽器交互。
我們上面說了,不同的訪問/刷新手段,會使瀏覽器使用不同的緩存策略,要讓瀏覽器走強制緩存對請求方式有一個要求: 在URI輸入欄中輸入然後回車/通過書簽訪問

對比緩存:

在瀏覽器已經緩存數據的情況下,使用對比緩存去請求數據的流程是這樣的:
image

有同學可能會問,基於對比緩存的流程下,不管是否使用緩存,都需要向伺服器發送請求,那麼還用緩存乾什麼?
這個問題,我們現在來探討一下。
對比緩存,顧名思義,需要進行比較判斷是否可以使用緩存。
瀏覽器第一次請求數據時,伺服器會將緩存標識與數據一起返回給瀏覽器,瀏覽器將二者備份至緩存資料庫中。
當瀏覽器再次請求數據時,瀏覽器將備份的緩存標識發送給伺服器,伺服器根據緩存標識進行判斷,判斷成功後,返回304狀態碼,通知客戶端比較成功,可以使用緩存數據。
舉個例子:
第一次訪問:
image

第二次訪問:
image

對比緩存,響應header中會有兩個欄位來標明規則

  • Last-Modified / If-Modified-Since
    伺服器響應請求時,會通過Last-ModifiedHTTP頭告訴瀏覽器資源的最後修改時間,瀏覽器本地對資源緩存起來,之後再請求的時候,會帶上一個HTTP頭If-Modified-Since,這個值就是伺服器上一次給的Last-Modified的時間,伺服器會拿著瀏覽器傳過來的時間比對資源當前最後的修改時間,如果大於If-Modified-Since,則說明資源修改過了,瀏覽器不能再使用緩存,伺服器重新一份完整的資源瀏覽器,否則瀏覽器可以繼續使用緩存,並返回304狀態碼

  • Etag / If-None-Match(優先順序高於Last-Modified / If-Modified-Since)
    伺服器響應請求時,通過EtagHTTP頭部告訴瀏覽器當前資源在伺服器的唯一標識(生成規則由伺服器決定),瀏覽器再次請求時,就會帶上一個頭If-None-Match,這個值就是伺服器上一次給的Etag的值,伺服器比對一下資源當前的Etag是否跟If-None-Match一致,不一致則說明資源修改過了,瀏覽器不能再使用緩存,否則瀏覽器可以繼續使用緩存,並返回304狀態碼

值得註意的是:Etag 的校驗優先順序高於 Last-Modified
看個例子:
第一次請求,伺服器的響應頭包含了
image

第二次請求,瀏覽器的請求頭
image

總結

我們再看一下HTTP緩存的一個總概流程圖:
image

  • HTTP緩存主要分強制緩存和對比緩存
  • 強制緩存的HTTP相關頭部Cache-Control,Exipres(HTTP1.0),瀏覽器直接讀本地緩存,不會再跟伺服器端交互,狀態碼200。
  • 對比緩存的HTTP相關頭部Last-Modified / If-Modified-Since, Etag / If-None-Match (優先順序比Last-Modified / If-Modified-Since高),每次請求需要讓伺服器判斷一下資源是否更新過,從而決定瀏覽器是否使用緩存,如果是,則返回304,否則重新完整響應。

最後

文章如果對你有收穫,可以收藏轉發,這也是對我寫作的肯定!另外可以關註我公眾號「碼農富哥」 (搜索id:coder2025),我會持續輸出Python,服務端架構,電腦基礎(MySQL, Linux,TCP/IP)的 原創 文章

掃碼關註我:碼農富哥


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 基本數據類型 1.整數類型(byte,short,int,long)2.浮點數類型(float,double)3.字元類型(char)4.布爾類型(boolean) 整數類型 --byte 使用byte關鍵字來定義byte型變數 例如: byte a=1; byte b=2,c=3; 整數型中分配空 ...
  • 一、對象導論 1:多態的可互換對象 面向對象程式設計語言使用了後期綁定的概念。 當向對象發送消息時,被調用的代碼直到運行時才能確定。也叫動態綁定。 2:單根繼承結構 所有的類最終都繼承自單一的基類,這個終極基類的名字就是Object 3:對象的創建和生命期 對象的數據處於作用域,Java完全採用了動 ...
  • 5種PHP生成圖片驗證碼實例,包括數字驗證碼、數字+字母驗證碼、中文驗證碼、仿google驗證碼和算術驗證碼,PHP生成驗證碼的原理:通過GD庫,生成一張帶驗證碼的圖片,並將驗證碼保存在Session中。 js驗證 1 $(function() { 2 $("#getcode_num").click ...
  • 一、前言 Xlinx的ZYNQ系列SOC集成了APU、各種專用外設資源和傳統的FPGA邏輯,為ARM+FPGA的應用提供助力,降低功耗和硬體設計難度的同時極大提高兩者間傳輸的帶寬。之前在研究生課題中使用過ZYNQ搭建環路系統對演算法進行板級驗證,但並沒有深入使用和理解這個異構平臺,今天算是對入門的總結 ...
  • 文件的基本操作 文件讀寫: 文件的讀寫滿足以下3個步驟: 1).打開文件 2).操作數據(讀、寫) 3).關閉文件 --> 不要忘記 1).打開文件: python的open() 方法用於打開一個文件,並返迴文件對象,在對文件進行處理過程都需要使用到這個函數,如果該文件無法被打開,會拋出 OSErr ...
  • 一.filter函數簡介 filter函數主要用來篩選數據,過濾掉不符合條件的元素,並返回一個迭代器對象,如果要轉換為列表list或者元祖tuple,可以使用內置函數list() 或者內置函數tuple()來轉換; filter函數接收兩個參數,第一個為函數,第二個為序列,序列的每個元素作為參數傳遞 ...
  • 一、反射: 1、反射指可以在運行時載入、探知、使用編譯期間完全未知的類。 2、程式在運行狀態中,可以動態載入一個只有名稱的類,對於任意一個已載入的類,都能夠知道這個類的所有屬性和方法; 對於任意一個對象,都能調用它的任意一個方法和屬性。 3、載入完類後,在堆記憶體中產生一個Class類型的對象(一個類 ...
  • 我們說的環境變數,一般是指的是Path環境變數。 第一步:點擊“我的電腦”,右鍵,“屬性” 第二步:點擊“高級系統設置”,彈出的視窗選“高級”選項卡,點擊“環境變數” 第三步:找到“系統變數”,滾動環境變數列表,找到“Path”這個環境變數,點擊“編輯” 第四步:添加你要讓cmd去搜尋的路徑,比如你 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...