緩存分為服務(wù)端緩存(比如 Nginx侈百、Memcached)和客戶端緩存(比如 瀏覽器)瓮下。
以下是關(guān)于瀏覽器緩存的一些記錄
緩存機(jī)制
瀏覽器緩存控制機(jī)制有兩種:
1、Meta標(biāo)簽
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="0">
清除瀏覽器中的緩存钝域,必須從服務(wù)端獲取最新內(nèi)容讽坏,但不是所有瀏覽器都支持
2、HTTP頭信息
Expires:即在 HTTP 頭中指明具體失效的時間(HTTP/1.0)
Cache Control:max-age 在 HTTP 頭中按秒指定失效的時間例证,優(yōu)先級高于Expires(HTTP/1.1)
Last-Modified/If-Modified-Since:文件最后一次修改的時間(精度是秒路呜,HTTP/1.0),需要Cache-Contral過期
Etag:當(dāng)前資源在服務(wù)器的唯一標(biāo)識(生成規(guī)則由服務(wù)器決定)ETag的值,默認(rèn)是對文件的索引節(jié)(INode)拣宰,大械程椤(Size)和最后修改時間(MTime)進(jìn)行Hash后得到的巡社,優(yōu)先級高于Last-Modified;在分布式的Web系統(tǒng)中肥荔,當(dāng)訪問落在不同的物理機(jī)上時會返回不同的ETag,進(jìn)而導(dǎo)致304失效朝群,降級為200請求(HTTP/1.1)姜胖,需要Cache-Contral過期
Pragma:no-cache 兼容HTTP/1.0
緩存狀態(tài)碼
200 OK (from cache) 是瀏覽器沒有跟服務(wù)器確認(rèn)誉帅,直接用了瀏覽器緩存;
304 Not Modified 是瀏覽器和服務(wù)器多確認(rèn)了一次緩存有效性右莱,再用的緩存慢蜓。
304 Not Modified 比 200 OK (from cache) 慢晨抡,指的是瀏覽器還向服務(wù)器確認(rèn)了下 "If-Not-Modified",才用的緩存
Cache驗證
Freshness驗證
和瀏覽器策略以及Cache Control(HTTP/1.1)與Expires(HTTP/1.0)有關(guān)
最好的請求是不必與服務(wù)器進(jìn)行通信的請求:通過響應(yīng)的本地緩存如捅,可以避免所有的網(wǎng)絡(luò)延遲以及數(shù)據(jù)傳輸?shù)臄?shù)據(jù)成本镜遣。
Cache-Contral
no-cache 必須先與服務(wù)器確認(rèn)返回的響應(yīng)是否被更改
no-store 直接禁止瀏覽器和所有中繼緩存存儲返回的任何版本的響應(yīng)
public 響應(yīng)可被任何緩存區(qū)緩存
private 瀏覽器可以緩存private響應(yīng)烈涮,不允許任何中繼緩存對其進(jìn)行緩存窖剑;例如西土,用戶瀏覽器可以緩存包含用戶私人信息的HTML網(wǎng)頁需了,但是CDN不能緩存
max-age 緩存最長時間
緩存策略
HTML5 Boilerplate 項目nginx配置文件樣例
# cache.appcache, your document html and data
location ~* \.(?:manifest|appcache|html?|xml|json)$ {
expires -1;
}
# Feed
location ~* \.(?:rss|atom)$ {
expires 1h;
}
# Media: images, icons, video, audio, HTC
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
expires 1M;
access_log off;
add_header Cache-Control "public";
}
# CSS and Javascript
location ~* \.(?:css|js)$ {
expires 1y;
access_log off;
}
Validation驗證
Last-Modified和ETag
通過驗證令牌可以進(jìn)行高效的資源更新檢查:如果資源未更改肋乍,則不會傳輸任何數(shù)據(jù)
Status Code:304 Not Modified
Response Head
ETag:"578ba64c-7ddf"
Last-Modified:Sun, 17 Jul 2016 15:37:48 GMT
Request Head
If-Modified-Since:Sun, 17 Jul 2016 15:37:48 GMT
If-None-Match:"578ba64c-7ddf"
200 or 304
在沒有設(shè)置Cache-Contral的情況下堪伍,設(shè)置Last-Modified和ETag緩存觅闽,會出現(xiàn)200(from cache)和304 交替出現(xiàn)的情況
設(shè)置Cache-Contral的情況下蛉拙,過期刷新會出現(xiàn)304(如果有更新內(nèi)容,則是200)吮廉,之后再過期之前刷新都是200(from cache)硫惕。如果要確保要向服務(wù)端確認(rèn),可以將Cache-Contral的max-age設(shè)置為0踪旷。
chrome 測試 刷新 和 輸入URL回車 測試并不會影響200(from cache)和304 的出現(xiàn)
緩存方案
較長的過期時間令野,節(jié)省帶寬气破,提高性能餐抢;更改資源的網(wǎng)址,強(qiáng)制用戶下載新響應(yīng)
按需更新缤言,精確的緩存控制
靜態(tài)資源CDN部署
更資源發(fā)布路徑實現(xiàn)非覆蓋式發(fā)布(多版本共存)