web緩存

目錄

簡述

服務器端緩存

CDN緩存

未使用CDN

使用CDN

CDN緩存判斷文件是否需要更新的機制

CDN緩存刷新

前端緩存

http緩存 

http請求緩存過程

http緩存分類


簡述

Web 緩存大致可以分爲:數據庫緩存、服務器端緩存(代理服務器緩存、CDN 緩存)、前端緩存(瀏覽器緩存(indexDB、cookie、localstorage 等等)、HTTP緩存)。本文重點介紹紅色字體部分

在用戶第一次訪問網站後,網站的一些靜態資源如圖片等就會被下載到本地,作爲緩存,當用戶第二次訪問該網站的時候,瀏覽器就會從緩存中加載資源,不用向服務器請求資源,從而提高了網站的訪問速度,而若使用了CDN,當瀏覽器本地緩存的資源過期之後,瀏覽器不是直接向源站點請求資源,而是向CDN邊緣節點請求資源,CDN邊緣節點中也存在緩存,若CDN中的緩存也過期,那就由CDN邊緣節點向源站點發出回源請求來獲取最新資源。


服務器端緩存

CDN緩存

CDN:Content Delivery Network/Content Ddistribute Network,即內容分發網絡
客戶端請求數據時,先從本地緩存查找,如果被請求數據沒有過期,拿過來用,如果過期,就向CDN邊緣節點發起請求。CDN便會檢測被請求的數據是否過期,如果沒有過期,就返回數據給客戶端,如果過期,CDN再向源站發送請求獲取新數據。

未使用CDN

  1. 用戶在瀏覽器訪問欄中輸入要訪問的域名。
  2. 瀏覽器向DNS服務器請求對該域名的解析。
  3. DNS服務器返回該域名的IP地址給瀏覽器。
  4. 瀏覽器使用該IP地址向服務器請求內容。
  5. 服務器將用戶請求的內容返回給瀏覽器。

使用CDN

  1. 用戶在瀏覽器中輸入要訪問的域名。
  2. 瀏覽器向DNS服務器請求對域名進行解析。由於CDN對域名解析進行了調整,DNS服務器會最終將域名的解析權交給CNAME指向的CDN專用DNS服務器。
  3. CDN的DNS服務器將CDN的負載均衡設備IP地址返回給用戶。
  4. 用戶向CDN的負載均衡設備發起內容URL訪問請求。
  5. CDN負載均衡設備會爲用戶選擇一臺合適的緩存服務器提供服務。選擇的依據包括:根據用戶IP地址,判斷哪一臺服務器距離用戶最近;根據用戶所請求的URL中攜帶的內容名稱,判斷哪一臺服務器上有用戶所需內容;查詢各個服務器的負載情況,判斷哪一臺服務器的負載較小。基於以上這些依據的綜合分析之後,負載均衡設置會把緩存服務器的IP地址返回給用戶。
  6. 用戶向緩存服務器發出請求。
  7. 緩存服務器響應用戶請求,將用戶所需內容傳送到用戶。

如果這臺緩存服務器上並沒有用戶想要的內容,而負載均衡設備依然將它分配給了用戶,那麼這臺服務器就要向它的上一級緩存服務器請求內容,直至追溯到網站的源服務器將內容拉取到本地。

CDN緩存判斷文件是否需要更新的機制

CDN節點緩存機制在不同服務商中是不同的,但一般都遵循HTTP協議,通過http響應頭中的Cache-Control:max-age的字段來設置CDN節點文件緩存時間。當客戶端向CDN節點請求數據時,CDN會判斷緩存數據是否過期,若沒有過期,則直接將緩存數據返回給客戶端,否則就向源站點發出請求,從源站點拉取最新數據,更新本地緩存,並將最新數據返回給客戶端。CDN服務商一般會提供基於文件後綴、目錄多個維度來指定CDN緩存時間,爲用戶提供更精細化的緩存管理。CDN緩存時間會對“回源率”產生直接的影響,若CDN緩存時間短,則數據經常失效,導致頻繁回源,增加了源站的負載,同時也增大了訪問延時;若緩存時間長,數據更新時間慢,因此需要針對不同的業務需求來選擇特定的數據緩存管理。

CDN緩存刷新

CDN節點對開發者時透明的,可以通過CDN服務商提供的“刷新緩存”接口來達到清理CDN節點緩存的效果,強制使數據過期,從而獲取到最新的數據。


前端緩存

http緩存 

http請求緩存過程

  1. 瀏覽器第一次請求資源時,服務器返回資源,並在respone header頭中回傳資源的緩存參數,瀏覽器將其進行緩存;
  2. 第二次請求時,瀏覽器判斷這些請求參數,命中強緩存就直接200(瀏覽器先根據這個資源的http頭信息來判斷是否命中強緩存。如果命中則直接加在緩存中的資源,並不會將請求發送到服務器。),否則就把請求參數加到request header頭中傳給服務器,看是否命中協商緩存,命中則返回304(如果未命中強緩存,則瀏覽器會將資源加載請求發送到服務器。服務器來判斷瀏覽器本地緩存是否失效。若可以使用,則服務器並不會返回資源信息,瀏覽器繼續從緩存加載資源。),否則服務器會返回新的資源(如果未命中協商緩存,則服務器會將完整的資源返回給瀏覽器,瀏覽器加載新資源,並更新緩存)。

http緩存分類

根據是否需要向服務器重新發起HTTP請求將緩存過程分爲兩個部分:強緩存和協商緩存

強緩存不會向服務器發送請求,直接從緩存中讀取資源
可以通過設置三種http header實現,優先級從高到低爲:Pragma --> Cache-Control --> Expires

  1. Pragma:http1.0的產物,值爲no-cache時禁用緩存,現常用來做http的向下兼容。
  2. Cache-Control:用於控制緩存的行爲,是一個通用首部字段,可組合多種指令使用。

指令     作用
public     表示響應可以被客戶端和代理服務器緩存
private     表示響應只可以被客戶端緩存
no-cache     資源被緩存,但是立即失效,下次會發起請求驗證資源是否過期
no-store     不緩存任何響應
max-age=xx     緩存xx秒後就過期,需要重新請求
s-maxage=xx     覆蓋max-age,作用一樣,只在代理服務器中生效
max-stale=xx     表示xx秒內,即使緩存過期,也使用該緩存
min-fresh=xx     希望在xx秒內獲取最新的響應

     3.Expires:緩存過期時間,用來指定資源到期的時間,是服務器端具體的時間點。

在強緩存失效後,瀏覽器攜帶緩存標識向服務器發起請求,由服務器根據緩存標識決定是否使用協商緩存。
主要有以下兩種情況:

    協商緩存生效,返回304和not modified。
    協商緩存失效,返回200和請求結果。

可以通過設置兩種http header實現,優先級從高到低爲:

    ETag/If-None-Match --> last-modified/If-Modified-Since

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

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

總結:

瀏覽器第一次請求:

瀏覽器再次請求時:

參考文章:

https://www.cnblogs.com/ranyonsue/p/8918908.html

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