HTTP緩存基礎概念入門

一般根據是否需要向服務器重新發起HTTP請求將緩存分爲強制緩存協商緩存

強制緩存

強制緩存就是直接從瀏覽器緩存查找結果,並根據結果的緩存規則來決定是否使用該緩存的過程。

  • 不存在該緩存結果和標識,強制緩存失效,則直接向服務器發起請求(跟第一次發起請求一致)

  • 存在緩存結果和標識,但結果已失效,強制緩存失效,則使用協商緩存

  • 存在緩存結果和標識,並且結果未失效,強制緩存生效,直接返回該結果

控制強制緩存的字段分別是ExpiresCache-Control,其中Cache-Control優先級比Expires高。

Expires

Expires是HTTP/1.0控制網頁緩存的字段,其值爲服務器返回該請求結果緩存的到期時間,即再次發起該請求時,如果客戶端的時間小於Expires的值時,直接使用緩存結果。

Expires是HTTP/1.0的字段,但現在瀏覽器默認使用HTTP/1.1,那麼HTTP/1.1中網頁緩存是否還是由`Expires`控制?

到了HTTP/1.1,Expires已經被Cache-Control替代,原因在於Expires控制緩存的原理是使用客戶端的時間和服務端返回的時間做對比,那麼如果客戶端與服務端的時間因爲某些原因(例如時區)發送誤差,那麼強制緩存則會直接失效。

Cache-Control

在HTTP/1.1中,Cache-Control是最重要的規則,主要用於控制網頁緩存,主要取值爲:

  • public 所有內容都將被緩存(客戶端/代理服務器/CDN等)

  • private 只有客戶端可以緩存,Cache-Control默認值

  • no-cache 客戶端緩存內容,但是是否使用緩存則需要經過協商緩存來驗證決定

  • no-store 所有內容都不會被緩存,即不使用強制緩存,也不使用協商緩存

  • max-age=xxx 緩存將在xxx秒後失效

注意:Cache-Control/Expires同時存在時,只有Cache-Control生效

協商緩存

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

  1. 協商緩存生效,返回304,服務器告訴瀏覽器資源未更新,則再去瀏覽器緩存中訪問資

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

同樣,協商緩存的標識也是在響應報文的HTTP頭和請求結果一起返回給瀏覽器的,控制協商緩存的字段分別有:

  • Last-Modified/If-Modified-Since

  • Etag/If-None-Match

其中Etag/If-None-Match優先級比Last-Modified/If-Modified-Since高

Last-Modified/If-Modified-Since

Last-Modified是服務器響應請求時,返回該資源文件在服務器最後被修改的時間。

If-Modified-Since則是客戶端再次發起該請求時,攜帶上次請求返回的Last-Modified值,通過此字段告訴服務器該資源上次請求返回的最後被修改時間。服務器收到該請求,發現請求頭含有If-Modified-Since字段,則會根據If-Modified-Since的字段值與該資源在服務器的最後被修改時間做對比,若服務器的資源最後修改時間大於If-Modified-Since的字段值,則重新返回資源,狀態碼爲200;否則返回304,代表資源無更新,可以繼續使用緩存文件。

Etag/If-None-Match

Etag是服務器響應請求時,返回當前資源文件的一個唯一標識(由服務器生成)。

If-None-Match是客戶端再次發起請求時,攜帶上次請求返回的唯一標識Etag值,服務端收到該請求後,發現該請求含有If-None-Match,則會根據If-None-Match的字段值與該資源在服務器的Etag值做對比,一致則返回304,代表資源無更新,繼續使用緩存文件,否則重新返回資源,狀態碼爲200.

總結

強制緩存優先於協商緩存,若強制緩存生效則直接使用緩存,若不生效則進行協商緩存,協商緩存由服務器決定是否使用緩存,若協商緩存失效,那麼代表該請求的緩存失效,重新獲取請求結果,再存入瀏覽器緩存中;生效則返回304,繼續使用緩存。

推薦閱讀

牛!月入2w,95後送外賣的程序員,送餐途中改bug

再見,Kotlin !你好, Java !

程序員寫了一款手遊美女"猜拳脫衣",全公司立馬被抓了!

厲害了!28歲程序員期權過億,彪悍從字節退休!

掃碼加我微信進羣,內推和技術交流,大佬們零距離

如有收穫,點個在看,誠摯感謝

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