1. 程式人生 > >深入理解http(二)------http的緩存機制及原理

深入理解http(二)------http的緩存機制及原理

dad hl7 工作 tps sla vhk b+ vpp lrn

一、概念基礎 參考原文:https://blog.csdn.net/hiredme/article/details/73468040

http的緩存,主要存在於本地瀏覽器和web代理服務器中。 在這裏,我們講的是瀏覽器緩存。

技術分享圖片

1.  響應頭ETag(Entity Tag)

Etag用來表示一個資源。在服務器返回響應時包含這個值,不同的資源response返回不一樣的Etag。在下次請求相同的資源時,瀏覽器會在 if-None-Match中帶著Etag的傳給服務器,如果服務器發現Etag和上次相同,直接返回304資源未發生改變,瀏覽器使用緩存數據。只要資源有變化,Etag就會重新生成。

請求頭if-None-Match。if-None-Match表示客戶端存取的是該資源的校驗值,也就是Etag

  Etag是上一次加載資源時,服務器返回的response header,是對該資源的一種唯一標識,只要資源有變化,Etag就會重新生成。瀏覽器在下一次加載資源向服務器發送請求時,會將上一次返回的Etag值放到request header裏的If-None-Match裏,服務器只需要比較客戶端傳來的If-None-Match跟自己服務器上該資源的ETag是否一致,就能很好地判斷資源相對客戶端而言是否被修改過了。如果服務器發現ETag匹配不上,那麽直接以常規GET 200回包形式將新的資源(當然也包括了新的ETag)發給客戶端;如果ETag是一致的,則直接返回304知會客戶端直接使用本地緩存即可。
  技術分享圖片

  Etag和Last-Modified兩者之間對比:
首先在精確度上,Etag要優於Last-Modified。Last-Modified的時間單位是秒,如果某個文件在1秒內改變了多次,那麽他們的Last-Modified其實並沒有體現出來修改,但是Etag每次都會改變確保了精度;如果是負載均衡的服務器,各個服務器生成的Last-Modified也有可能不一致。
第二在性能上,Etag要遜於Last-Modified,畢竟Last-Modified只需要記錄時間,而Etag需要服務器通過算法來計算出一個hash值。
第三在優先級上,服務器校驗優先考慮Etag

2.響應頭Cache-Control

Cache_-Control主要用來控制緩存相關的東西。Cache-Control頭在http 1.1中定義,取代了http1.0版本中用來定義響應緩存策略的頭例如(Expires)

緩存指令主要包括:

  1.public private   public用來聲明瀏覽器和web代理服務器都可以緩存. private表示僅允許瀏覽器緩存,代理服務器不允許緩存

  2.no-cache    no-cache不是指不緩存,而是指每次請求資源之前都先向服務器驗證該資源是否發生改變

  3.no-store     表示不緩存,即瀏覽器和代理服務器都不緩存。

  4.max-age     表示緩存的內容在XXX秒後失效。

  5.must-revalidate 使得客戶端再次瀏覽當前頁面時必須法送http頭信息到服務器進行驗證,然後才決定是否加載客戶端本地cache

if-modified-since和last-modified的比較

  瀏覽器在第一次訪問資源時,服務器返回資源的同時,在response header中添加 Last-Modified的header,值是這個資源在服務器上的最後修改時間,瀏覽器接收後緩存文件和header;

    Last-Modified: Fri, 22 Jul 2016 01:47:00 GMT

  瀏覽器下一次請求這個資源,瀏覽器檢測到有 Last-Modified這個header,於是添加If-Modified-Since這個header,值就是Last-Modified中的值;服務器再次收到這個資源請求,會根據 If-Modified-Since 中的值與服務器中這個資源的最後修改時間對比,如果沒有變化,返回304和空的響應體,直接從緩存讀取,如果If-Modified-Since的時間小於服務器中這個資源的最後修改時間,說明文件有更新,於是返回新的資源文件和200。

技術分享圖片



  

二、緩存生效的過程

參考原文:https://www.cnblogs.com/mamimi/p/6900987.html

  服務器收到請求時,會在200OK中返回該資源的Last-Modified和ETag頭,客戶端將該資源保存在cache中,並記錄這兩個屬性。當客戶端需要發送相同的請求時,會在請求中攜帶If-Modified-Since和If-None-Match兩個頭。兩個頭的值分別是響應中Last-Modified和ETag頭的值。服務器通過這兩個頭判斷本地資源未發生變化,客戶端不需要重新下載,返回304響應。常見流程如下圖所示:

技術分享圖片


三、http的緩存機制 參考於:https://www.jianshu.com/p/54cc04190252
    個人對緩存數據失效的理解:個人認為緩存數據失效並不是緩存數據在內存或者磁盤中消失,只是不提供訪問,但是它還是真實存在與內存或者磁盤中。
    強制緩存失效:其實就是時間超過Expires或者Cache-Control中的max-age,導致緩存數據失效。     協商緩存失效:其實就是文件發生改變,Etag發生改變。 強制緩存和協商緩存   強制緩存:不會向服務器發送請求,直接從瀏覽器緩存中讀取資源。在chrome的控制臺的network選項中,可以看到該請求返回200的狀態碼,並且size顯示from disk cache或者 from memory cache。 技術分享圖片   from memory cache代表使用內存中的緩存,from disk cache則代表使用的是硬盤中的緩存,瀏覽器讀取緩存的順序為memory –> disk。在瀏覽器中,瀏覽器會在js和圖片等文件解析執行後直接存入內存緩存中,那麽當刷新頁面時只需直接從內存緩存中讀取(from memory cache);而css文件則會存入硬盤文件中,所以每次渲染頁面都需要從硬盤讀取緩存(from disk cache)。
緩存機制工作流程   在客戶端第一次請求數據時,此時瀏覽器緩存中沒有對應的緩存數據,需要請求服務器,服務器返回數據後,將數據存儲至瀏覽器緩存。 技術分享圖片

第二次請求數據時存在兩種情況:   1.緩存數據失效。

技術分享圖片

  2.緩存數據失效。

  緩存標識:個人理解為Etag的值。

  協商緩存就是在強制緩存失效後(也就是緩存數據失效後),瀏覽器帶著緩存標識向服務器發起請求有服務器根據緩存標識決定是否使用緩存的過程。主要有以下兩種情況:

    1.協商緩存生效,返回304和Not Modified。

    技術分享圖片

      2.協商緩存失效,返回200和請求結果

        技術分享圖片

緩存機制的總結

  強制緩存優先於協商緩存進行,若強制緩存(Expires和Cache-Control)生效則直接使用緩存,若不生效則進行協商緩存(Last-Modified / If-Modified-Since和Etag / If-None-Match),協商緩存由服務器決定是否使用緩存,若協商緩存失效,那麽代表該請求的緩存失效,返回200,重新返回資源和緩存標識,再存入瀏覽器緩存中;生效則返回304,繼續使用緩存。
技術分享圖片

  

深入理解http(二)------http的緩存機制及原理