一、 強緩存,不向服務器發請求,直接從本地硬盤(from disk cache/from memory cache)或者內存中獲取css
二、協商緩存,向服務器發出驗證,若是資源無更改,不從新返回資源內容,資源內容從本地獲取,,須要刷新command+rhtml
三、若是須要從服務器直接獲取,須要強制刷新,就是所謂的command+shift+r算法
1、強緩存瀏覽器
是利用HTTP響應報文中的Expires和Cache-Control兩個字段來控制的,用來表示資源的緩存時間。緩存
Expires:該字段是HTTP/1.0時的規範,它的值是一個絕對時間的GMT格式的時間字符串,如Expires: Mon, 06 Feb 2017 08:26:48 GMT。這個時間表明資源的失效時間,在此之間,即命中強緩存。可是它有一個明顯的缺點,當客戶端與服務器時間出現較大誤差,就會出現混亂。服務器
Cache-Control:爲了解決Expires出現的問題,HTTP/1.1添加了Cache-Control。主要是利用max-age來進行判斷,它是一個相對時間,如Cache-Control:max-age=600,表明着資源的有效期是600秒(10分鐘)。除了max-age外,Cache-Control還有如下幾個經常使用的值:網站
Last-Modified/If-Modified-Since:瀏覽器第一次請求一個資源的時候,服務器返回的header中會加上Last-Modified,它是一個時間標識該資源的最後修改時間。當瀏覽器再次請求該資源時,HTTP請求頭部會帶上If-Modified-Since,該值爲上次響應報文頭部的Last-Modified的值,服務器接收到If-Modified-Since,會根據資源的最後修改時間來判斷是否命中協商緩存,若是命中,返回304(Not Modified),而且不會返回Last-Modified和無響應body。不然返回200,而且返回Last-Modified和有響應的body。lua
ETag/If-None-Match:它們的值不是一個時間標識,而是一個校驗碼。ETag能夠保證每個資源都是惟一的,資源變化都會致使ETag變化,服務器根據接收到的If-None-Match來判斷是否命中協商緩存。可是當服務器返回304的時候,因爲ETag從新生成過(ETag的算法,沒有明確規定,能夠每次生成,也能夠生成後存儲起來),響應頭部也會帶上ETag,即便它跟以前的沒有變化。spa
爲何要有ETag?不是已經有Last-Modified嗎。.net
看了這麼多不知道你糊塗沒,下面有兩張圖,經過這兩張圖,你能對瀏覽器的緩存策略有一個新的認識
cdn緩存就是在瀏覽器和服務器間增長的一層緩存,緩存一些html、圖片、css、xml等靜態資源。
無cdn:
用戶在瀏覽網站的時候,瀏覽器可以在本地保存網站中的圖片或者其餘文件的副本,這樣用戶再次訪問該網站的時候,瀏覽器就不用再下載所有的文件,減小了下載量意味着提升了頁面加載的速度。
有cdn:
若是中間加上一層CDN,那麼用戶瀏覽器與服務器的交互以下:
客戶端瀏覽器先檢查是否有本地緩存,是否過時,若是過時,則向CDN邊緣節點發起請求,CDN邊緣節點會檢測用戶請求數據的緩存是否過時,若是沒有過時,則直接響應用戶請求,此時一個完成http請求結束;若是數據已通過期,那麼CDN還須要向源站發出回源請求(back to the source request),來拉取最新的數據。
4、不一樣的瀏覽器操做對應的緩存操做
瀏覽器緩存刷新