HTTP緩存總結

web緩存

web緩存定義

web緩存是指一個web資源(如html頁面,圖片,js,數據等)存在於web服務器和客戶端(瀏覽器)之間的副本。
緩存會根據進來的請求保存輸出內容的副本;當下一個請求來到的時候,若是是相同的URL,緩存會根據緩存機制決定是直接使用副本響應訪問請求,仍是向源服務器再次發送請求。比較常見的就是瀏覽器會緩存訪問過網站的網頁,當再次訪問這個URL地址的時候,若是網頁沒有更新,就不會再次下載網頁,而是直接使用本地緩存的網頁。只有當網站明確標識資源已經更新,瀏覽器纔會再次下載網頁。至於瀏覽器和網站服務器是如何標識網站頁面是否更新的機制,將在後面介紹。css

web緩存做用

  1. 減小網絡帶寬消耗:不管對於網站運營者或者用戶,帶寬都表明着金錢,過多的帶寬消耗,只會便宜了網絡運營商。當Web緩存副本被使用時,只會產生極小的網絡流量,能夠有效的下降運營成本。
  2. 下降服務器壓力:給網絡資源設定有效期以後,用戶能夠重複使用本地的緩存,減小對源服務器的請求,間接下降服務器的壓力。同時,搜索引擎的爬蟲機器人也能根據過時機制下降爬取的頻率,也能有效下降服務器的壓力。
  3. 減小網絡延遲,加快頁面打開速度:帶寬對於我的網站運營者來講是十分重要,而對於大型的互聯網公司來講,可能有時由於錢多而真的不在意。那Web緩存還有做用嗎?答案是確定的,對於最終用戶,緩存的使用可以明顯加快頁面打開速度,達到更好的體驗。

web緩存的類型

  1. 數據庫數據緩存
  2. 服務器端緩存
  3. 前端緩存
  4. web應用層緩存

前端緩存分類

5fdf8db1cb1349546327f58b584e9258d1094a27.jpg

HTTP緩存

http緩存

http緩存指的是: 當客戶端向服務器請求資源時,會先抵達瀏覽器緩存,若是瀏覽器有「要請求資源」的副本,就能夠直接從瀏覽器緩存中提取而不是從原始服務器中提取這個資源。
常見的http緩存只能緩存get請求響應的資源,對於其餘類型的響應則無能爲力,因此後續說的請求緩存都是指GET請求。
http緩存都是從第二次請求開始的。第一次請求資源時,服務器返回資源,並在respone header頭中回傳資源的緩存參數;第二次請求時,瀏覽器判斷這些請求參數,命中強緩存就直接200,不然就把請求參數加到request header頭中傳給服務器,看是否命中協商緩存,命中則返回304,不然服務器會返回新的資源。html

http緩存規則

  1. 新鮮度(過時機制):也就是緩存副本有效期。一個緩存副本必須知足如下任一條件,瀏覽器會認爲它是有效的,足夠新的,而直接從緩存中獲取副本並渲染:
  • 含有完整的過時時間控制頭信息(HTTP協議報頭),而且仍在有效期內
  • 瀏覽器已經使用過這個緩存副本,而且在一個會話中已經檢查過新鮮度
  1. 校驗值(驗證機制):服務器返回資源的時候有時在控制頭信息帶上這個資源的實體標籤Etag(Entity Tag),它能夠用來做爲瀏覽器再次請求過程的校驗標識。如過發現校驗標識不匹配,說明資源已經被修改或過時,瀏覽器需求從新獲取資源內容。

http緩存的分類

c2cec3fdfc039245b1578ce08994a4c27c1e257a.jpg

強制緩存

強制緩存在緩存數據未失效的狀況下(即Cache-Control的max-age沒有過時或者Expires的緩存時間沒有過時),那麼就會直接使用瀏覽器的緩存數據,不會再向服務器發送任何請求。強制緩存生效時,http狀態碼爲200。這種方式頁面的加載速度是最快的,性能也是很好的,可是在這期間,若是服務器端的資源修改了,頁面上是拿不到的,由於它不會再向服務器發請求了。這種狀況就是咱們在開發種常常遇到的,好比你修改了頁面上的某個樣式,在頁面上刷新了但沒有生效了。 跟強制緩存相關的header頭屬性有(Pragma/Cache-Control/Expires)
b58f8c5494eef01f1446742aeefe9925bd317d8a.jpg前端

  • max-age(單位爲s)

指定設置緩存最大的有效時間,定義的是時間長短。當瀏覽器向服務器發送請求後,在max-age這段時間裏瀏覽器就不會再向服務器發送請求了。咱們來找個資源看下。好比QQ推廣上的css資源,max-age=3600,也就是說緩存有效期爲3600秒(也就是1h)。因而在1天內都會使用這個版本的資源,即便服務器上的資源發生了變化,瀏覽器也不會獲得通知。web

  • s-maxage(單位爲s)

同max-age,只用於共享緩存(好比CDN緩存)。好比,當s-maxage=60時,在這60秒中,即便更新了CDN的內容,瀏覽器也不會進行請求。也就是說max-age用於普通緩存,而s-maxage用於代理緩存。若是存在s-maxage,則會覆蓋掉max-age和Expires header。數據庫

  • private

響應只做爲私有的緩存,不能在用戶間共享。若是要求HTTP認證,響應會自動設置爲 private瀏覽器

  • public

指定響應會被緩存,而且在多用戶間共享。也就是下圖的意思。若是沒有指定public仍是private,則默認爲public。緩存

  • no-cache:

能夠在本地或者代理服務器進行緩存,每次發起請求都要去服務器驗證,服務器返回可使用緩存,才能夠真正使用本地緩存,任何節點都不能直接使用緩存服務器

  • no-store:

瀏覽器或者代理服務器都不能存返回數據的緩存,永遠都須要去服務器請求新的數據網絡

協商緩存

79f0f736afc37931829bd0c6e5c4b74542a91169.jpg
協商緩存的執行流程是這樣的:當瀏覽器第一次向服務器發送請求時,會在響應頭中返回協商緩存的頭屬性:ETag和Last-Modified,其中ETag返回的是一個hash值,Last-Modified返回的是GMT格式的最後修改時間。而後瀏覽器在第二次發送請求的時候,會在請求頭中帶上與ETag對應的If-Not-Match,其值就是響應頭中返回的ETag的值,Last-Modified對應的If-Modified-Since。服務器在接收到這兩個參數後會作比較,若是返回的是304狀態碼,則說明請求的資源沒有修改,瀏覽器能夠直接在緩存中取數據,不然,服務器會直接返回數據。性能

場景實測
  1. 當強制緩存時間內文件變動會請求服務器嗎?
    不會
  2. 當強制緩存時間過時後會使用協商緩存嗎?
  3. 關閉瀏覽器後強制緩存時間會重置嗎?
    當緩存時間過時後(304)再次訪問會重置,若是在緩存時間內,不會重置。
  4. no-cash和no-store有什麼區別?
    no-cash會用協商緩存 ,no-stroe不會
  5. Last-Modified仍是etag哪一個優先級高?
    HTTP1.1中Etag的出現主要是爲了解決幾個 Last-Modified 比較難解決的問題:

    • Last-Modified 標註的最後修改只能精確到秒級,若是某些文件在1秒鐘之內,被修改屢次的話,它將不能準確標註文件的新鮮度
    • 若是某些文件會被按期生成,當有時內容並無任何變化,但 Last-Modified 卻改變了,致使文件無法使用緩存
    • 有可能存在服務器沒有準確獲取文件修改時間,或者與代理服務器時間不一致等情形

Etag是服務器自動生成或者由開發者生成的對應資源在服務器端的惟一標識符,可以更加準確的控制緩存。Last-Modified與ETag是能夠一塊兒使用的,服務器會優先驗證ETag,一致的狀況下,纔會繼續比對Last-Modified,最後才決定是否返回304。

相關文章
相關標籤/搜索