瀏覽器緩存
針對靜態文件,動態文件需要 web server解析
瀏覽器緩存有強緩存,協商緩存和啟發式緩存三種。
請求的基本過程,瀏覽器會先檢查cache-control和expires,看資源是否緩存過期,不過期,直接使用本地緩存,不發請求
過期,則向服務器發送請求,服務器比對If-none-match和Etag,或者If-modified-since和last-modified字段,
看資源是否發生改變,如果未改變,則返回304,body為空,否則返回200,body為文件內容。
1.強緩存
cache-control和expires設置的緩存時間,第一次請求後,文件被緩存在本地
其中cache-control優先級高於expires
返回狀態碼 200 OK (from disk cache)
或者 200 OK (from memory cache)
總之,就是 200 (from cache)
2.協商緩存
http請求的response header中有 last-modified和Etag
瀏覽器再次請求該資源時候,會在 requrest header中攜帶
If-none-match(等於上次Etag的值)
If-modifed-since(等於上次last-modified的值)
想服務發送請求,服務器對比If-none-match和Etag,If-modified-since和last-modified的值,
如果一致,則返回304狀態碼,body為空。
不一致,則返回200狀態碼,body為文件內容。
其中Etag的優先級高於last-modified
返回狀態碼 304 Not Modified
3.啟發式緩存
如果沒有cache-control和expires的緩存設置,瀏覽器依然會有一個本地緩存策略,就是啟發式緩存。
其計算方法如下:
http response header中的 Date(當前時間) 和 Last-Modified 的值
本地緩存時間 = (Date - Last-Modified) * 10%
因此,啟發式緩存的緩存時間可長可短,建議明確設置緩存時間
返回狀態碼 200 OK (與正常的無緩存請求一致,實際上使用了本地緩存,沒有發送請求)
chrome的Request Headers中會顯示一行字
Provisional(臨時的) header are shown, 表明此請求為啟發式緩存的請求。
字段解釋
Last-Modified:文件上次的修改時間
Etag:文件的唯一標識,類似於hash值
Etag解決了Last-Modified的哪些問題
1. Last-Modified的時間精確到秒級,當一個文件在1s內被多次修改,無法記錄
2. 某些文件會被周期性修改,但內容不變,此時不想利用Last-Modified的值更新緩存
3. 某些服務器不能精確得到文件的最後修改時
http request http respose
If-Modified-Since -> Last-Modified 時間上對比,一致則返回304
If-None-Match -> Etag 內容上對比,一致則返回304
在第一次請求URL的時候,服務器講 Last-Modified和Etag返回給客戶端
在第二次請求此URL的時候,客戶端將 If-Modified-Since 和 If-None-Match 發送到服務器
服務器將 If-Modified-Since 與 Last-Modified,If-None-Match 與 Etag做對比,一致則
返回304,否則返回200.
Expires
服務器返回的http response header中有Expires時,瀏覽器會在其標記的時間內不去下載請求的內容。
僅在地址欄輸入地址有效,F5刷新無效。
Pragma和Cahce-Control
Http1.0的Pragma和Http1.1的Cache-Control可以用來控制頁面緩存。
Pragma->no-cache, Expires->0 ,Cache-Control->no-cahce可以讓頁面不緩存。
Cache-Control的max-age可以設置頁面在客戶端緩存多少秒,是相對時間,並且覆蓋Expires
Age:代理服務的緩存時間(單位秒)
Date:響應生成的時間
Vary:Vary:Accept-Encoding,User-Agent告訴代理服務,要緩存資源的壓縮和未壓縮兩個版本
cache-contorl和pragma的no-cache設置,並不能完全禁用緩存
此設置只有部分瀏覽器支持,並且代理服務器由於不解析html文檔,完全不支持此方式
用戶行為與緩存的關系
1. 用戶在 地址欄回車,頁面鏈接跳轉,新開窗口,前進,後退時,強緩存和協商緩存均有效
2. 用戶在 F5刷新頁面,強緩存無效,協商緩存有效
3. 用戶在 ctrl+F5刷新頁面,強緩存和協商緩存均無效
分布式系統的緩存
分布式系統的多臺機器間的last-modified必須保持一致,而且盡量關閉Etag,
因為每臺機器的Etag都會不一致
服務器緩存
服務器緩存屬於共享緩存
包括
1. 代理服務器緩存
2. 源服務器緩存
3. CDN緩存
瀏覽器緩存