客戶端緩存和服務端緩存
- 客戶端緩存:既瀏覽器緩存,保存在本地的緩存,用戶可直接從本地讀取數據,大大加快請求時間
- 服務端緩存:代理服務器緩存或反向代理服務器緩存(nginx),CDN也是一種緩存機制,將數據存儲在CDN節點中,大大加快用戶的訪問返回速度
緩存機制
在客戶端決定使用本地緩存
在HTTP響應頭部定義該資源的緩存策略,包含 Expires和Cache-Control,在此處命中緩存時,返回狀態爲200(from catch)nginx
Expires:
- 表明資源到期時間,在此時間以前都可以直接從瀏覽器緩存取數據
- 是http 1.0的策略,如今瀏覽器基本都是http1.1
Cache-Control:
- Cache-Control比Expires的控制更加細緻
- 包含public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age
- public 表示響應可被任何緩存區緩存
- private 只可單個用戶的響應消息,不能被共享緩存
- no-catch 在沒有向服務器進行校驗的狀況下,不可用於後續請求
- no-store 禁止緩存
- max-age 當緩存策略爲可緩存時指定緩存時間
跟服務端確認後使用本地緩存
Last-Modified/If-Modified-Since
- HTTP響應頭部定義Last-Modified,標示這個響應資源的最後修改時間
- 以前的Cache-Control中的max-age過時時檢驗Last-Modified聲明
- 有Last-Modified(最後修改時間)聲明則像服務器發請求,並帶上If-Modified-Since(上次響應中Last-Modified的值)
- 若是Last-Modified較新表示資源有修改,直接服務器中讀取,響應200(OK);若是Last-Modified較舊,說明資源並無修改,響應304,客戶端從本地讀取緩存。
Etag/If-None-Match
- 與Last-Modified相似,用來標誌資源的有效性
- Etag在服務端設置,表示當前資源的版本。在響應請求時告訴客戶端當前的版本
- 以前的Cache-Control中的max-age過時時檢驗是否有Etag。若是有的話,再次向web服務器請求時帶上頭If-None-Match (上一次Etag的值)
- 若是If-None-Match與Etag值一致說明資源未被改動,響應304,客戶端從本地讀取緩存。若是值不同說明資源已經改動,返回200
Etag和Last-Modified的區別
- Last-Modified標註時間,只能精確到秒級,若是一個資源在一秒內改變屢次則沒法識別
- 有時文件被改動,可是內容不變,Last-Modified也會變
- Etag是服務器自動生成或者由開發者生成的對應資源在服務器端的惟一標識符
先說返回200(from catch)和304的區別
200(from catch): 表示直接從本地瀏覽器緩存中讀取,沒有和服務器進行交互。第一次請求該資源的時候設置Expires 或者 Cache-Control: max-age頭表示瀏覽器能夠緩存該資源,下次請求的時候該資源還未過時,則能夠從瀏覽器緩存中讀取。web
304: 表示發送 "If-Modified-Since"請求到服務器,若是資源從上次請求到此次請求沒有改變,則返回304。304的速度比200(from catch)更慢瀏覽器