瀏覽器緩存

針對靜態文件,動態文件須要 web server解析html

瀏覽器緩存有強緩存,協商緩存和啓發式緩存三種。web

請求的基本過程,瀏覽器會先檢查cache-control和expires,看資源是否緩存過時,不過時,直接使用本地緩存,不發請求
過時,則向服務器發送請求,服務器比對If-none-match和Etag,或者If-modified-since和last-modified字段,
看資源是否發生改變,若是未改變,則返回304,body爲空,不然返回200,body爲文件內容。chrome

1.強緩存瀏覽器

cache-control和expires設置的緩存時間,第一次請求後,文件被緩存在本地
其中cache-control優先級高於expires緩存

返回狀態碼 200 OK (from disk cache)
或者 200 OK (from memory cache)服務器

總之,就是 200 (from cache)分佈式

2.協商緩存spa

http請求的response header中有 last-modified和Etag
瀏覽器再次請求該資源時候,會在 request 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-modifiedserver

返回狀態碼 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緩存

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息