web緩存是指一個web資源(如html頁面,圖片,js,數據等)存在於web服務器和客戶端(瀏覽器)之間的副本。
緩存會根據進來的請求保存輸出內容的副本;當下一個請求來到的時候,若是是相同的URL,緩存會根據緩存機制決定是直接使用副本響應訪問請求,仍是向源服務器再次發送請求。比較常見的就是瀏覽器會緩存訪問過網站的網頁,當再次訪問這個URL地址的時候,若是網頁沒有更新,就不會再次下載網頁,而是直接使用本地緩存的網頁。只有當網站明確標識資源已經更新,瀏覽器纔會再次下載網頁。至於瀏覽器和網站服務器是如何標識網站頁面是否更新的機制,將在後面介紹。css
http緩存指的是: 當客戶端向服務器請求資源時,會先抵達瀏覽器緩存,若是瀏覽器有「要請求資源」的副本,就能夠直接從瀏覽器緩存中提取而不是從原始服務器中提取這個資源。
常見的http緩存只能緩存get請求響應的資源,對於其餘類型的響應則無能爲力,因此後續說的請求緩存都是指GET請求。
http緩存都是從第二次請求開始的。第一次請求資源時,服務器返回資源,並在respone header頭中回傳資源的緩存參數;第二次請求時,瀏覽器判斷這些請求參數,命中強緩存就直接200,不然就把請求參數加到request header頭中傳給服務器,看是否命中協商緩存,命中則返回304,不然服務器會返回新的資源。html
強制緩存在緩存數據未失效的狀況下(即Cache-Control的max-age沒有過時或者Expires的緩存時間沒有過時),那麼就會直接使用瀏覽器的緩存數據,不會再向服務器發送任何請求。強制緩存生效時,http狀態碼爲200。這種方式頁面的加載速度是最快的,性能也是很好的,可是在這期間,若是服務器端的資源修改了,頁面上是拿不到的,由於它不會再向服務器發請求了。這種狀況就是咱們在開發種常常遇到的,好比你修改了頁面上的某個樣式,在頁面上刷新了但沒有生效了。 跟強制緩存相關的header頭屬性有(Pragma/Cache-Control/Expires)
前端
指定設置緩存最大的有效時間,定義的是時間長短。當瀏覽器向服務器發送請求後,在max-age這段時間裏瀏覽器就不會再向服務器發送請求了。咱們來找個資源看下。好比QQ推廣上的css資源,max-age=3600,也就是說緩存有效期爲3600秒(也就是1h)。因而在1天內都會使用這個版本的資源,即便服務器上的資源發生了變化,瀏覽器也不會獲得通知。web
同max-age,只用於共享緩存(好比CDN緩存)。好比,當s-maxage=60時,在這60秒中,即便更新了CDN的內容,瀏覽器也不會進行請求。也就是說max-age用於普通緩存,而s-maxage用於代理緩存。若是存在s-maxage,則會覆蓋掉max-age和Expires header。數據庫
響應只做爲私有的緩存,不能在用戶間共享。若是要求HTTP認證,響應會自動設置爲 private瀏覽器
指定響應會被緩存,而且在多用戶間共享。也就是下圖的意思。若是沒有指定public仍是private,則默認爲public。緩存
能夠在本地或者代理服務器進行緩存,每次發起請求都要去服務器驗證,服務器返回可使用緩存,才能夠真正使用本地緩存,任何節點都不能直接使用緩存服務器
瀏覽器或者代理服務器都不能存返回數據的緩存,永遠都須要去服務器請求新的數據網絡
協商緩存的執行流程是這樣的:當瀏覽器第一次向服務器發送請求時,會在響應頭中返回協商緩存的頭屬性:ETag和Last-Modified,其中ETag返回的是一個hash值,Last-Modified返回的是GMT格式的最後修改時間。而後瀏覽器在第二次發送請求的時候,會在請求頭中帶上與ETag對應的If-Not-Match,其值就是響應頭中返回的ETag的值,Last-Modified對應的If-Modified-Since。服務器在接收到這兩個參數後會作比較,若是返回的是304狀態碼,則說明請求的資源沒有修改,瀏覽器能夠直接在緩存中取數據,不然,服務器會直接返回數據。性能
Last-Modified仍是etag哪一個優先級高?
HTTP1.1中Etag的出現主要是爲了解決幾個 Last-Modified 比較難解決的問題:
Etag是服務器自動生成或者由開發者生成的對應資源在服務器端的惟一標識符,可以更加準確的控制緩存。Last-Modified與ETag是能夠一塊兒使用的,服務器會優先驗證ETag,一致的狀況下,纔會繼續比對Last-Modified,最後才決定是否返回304。