緩存的概念緩存這個東西真的是無處不在, 有瀏覽器端的緩存,, 有服務(wù)器端的緩存,,有代理服務(wù)器的緩存, 有ASP.NET頁面緩存,,對象緩存,。 數(shù)據(jù)庫也有緩存, 等等,。 http中具有緩存功能的是瀏覽器緩存,,以及緩存代理服務(wù)器。
http緩存的是指:當(dāng)Web請求抵達(dá)緩存時,, 如果本地有“已緩存的”副本,就可以從本地存儲設(shè)備而不是從原始服務(wù)器中提取這個文檔,。 緩存的好處緩存的好處是顯而易見的,, 好處有, 1. 減少了冗余的數(shù)據(jù)傳輸,,節(jié)省了網(wǎng)費,。 2. 減少了服務(wù)器的負(fù)擔(dān), 大大提高了網(wǎng)站的性能 3. 加快了客戶端加載網(wǎng)頁的速度
Fiddler可以方便地查看緩存的headerFiddler中把header都分門別類的放在一起,,這樣方便查看,。
如何判斷緩存新鮮度Web服務(wù)器通過2種方式來判斷瀏覽器緩存是否是最新的。 第一種,, 瀏覽器把緩存文件的最后修改時間通過 header ”If-Modified-Since“來告訴Web服務(wù)器,。 第二種,, 瀏覽器把緩存文件的ETag, 通過header "If-None-Match", 來告訴Web服務(wù)器。
通過最后修改時間, 來判斷緩存新鮮度
2. Web服務(wù)器收到Request,,將服務(wù)器的文檔修改時間(Last-Modified): 跟request header 中的,,If-Modified-Since相比較, 如果時間是一樣的,, 說明緩存還是最新的,, Web服務(wù)器將發(fā)送304 Not Modified給瀏覽器客戶端, 告訴客戶端直接使用緩存里的版本,。如下圖,。 3. 假如該文檔已經(jīng)被更新了。Web服務(wù)器將發(fā)送該文檔的最新版本給瀏覽器客戶端,, 如下圖,。
實例: 打開Fiddler, 然后打開博客園首頁。然后F5刷新幾次瀏覽器,。 你會看到博客園首頁也用了緩存,。
與緩存有關(guān)的header我們來看看每個header的具體含義。 Request
Response
如果同時存在cache-control和Expires怎么辦呢,?
ETagETag是實體標(biāo)簽(Entity Tag)的縮寫, 根據(jù)實體內(nèi)容生成的一段hash字符串(類似于MD5或者SHA1之后的結(jié)果),,可以標(biāo)識資源的狀態(tài),。 當(dāng)資源發(fā)送改變時,ETag也隨之發(fā)生變化,。 ETag是Web服務(wù)端產(chǎn)生的,,然后發(fā)給瀏覽器客戶端。瀏覽器客戶端是不用關(guān)心Etag是如何產(chǎn)生的,。 為什么使用ETag呢,? 主要是為了解決Last-Modified 無法解決的一些問題,。 1. 某些服務(wù)器不能精確得到文件的最后修改時間, 這樣就無法通過最后修改時間來判斷文件是否更新了,。 2. 某些文件的修改非常頻繁,,在秒以下的時間內(nèi)進(jìn)行修改. Last-Modified只能精確到秒。 3. 一些文件的最后修改時間改變了,,但是內(nèi)容并未改變,。 我們不希望客戶端認(rèn)為這個文件修改了。
實例,, 打開Fiddler, 打開博客園首頁,。 你可以看到很多圖片,或者CSS文件都是用了緩存,。 這些都是通過比較ETag的值,,來判斷文件是否更新了。
瀏覽器不使用緩存CTRL+F5強制刷新瀏覽器,,或者設(shè)置IE,。 可以讓瀏覽器不使用緩存。 1. 瀏覽器發(fā)送Http request, 給Web 服務(wù)器,, header中帶有Cache-Control: no-cache. 明確告訴Web服務(wù)器,,客戶端不使用緩存。 2. Web服務(wù)器將把最新的文檔發(fā)送給瀏覽器客戶端.
實例: 打開Fiddler, 打開博客園首頁,, 然后按CTRL+F5強制刷新瀏覽器,,你將看到 Pragma: no-cache的作用和Cache-Control: no-cache一模一樣。 都是不使用緩存,。 Pragma: no-cache 是HTTP 1.0中定義的,, 所以為了兼容HTTP 1.0. 所以會同時使用Pragma: no-cache和Cache-Control: no-cache
直接使用緩存,不去服務(wù)器驗證按F5刷新瀏覽器和在地址欄里輸入網(wǎng)址然后回車,。 這兩個行為是不一樣的,。 按F5刷新瀏覽器, 瀏覽器會去Web服務(wù)器驗證緩存,。 如果是在地址欄輸入網(wǎng)址然后回車,,瀏覽器會"直接使用有效的緩存", 而不會發(fā)http request 去服務(wù)器驗證緩存,這種情況叫做緩存命中,,如下圖
實例: 比較第一次訪問博客園主頁和第二次博客園主頁 1. 啟動Fiddler, 用firefox打開博客園主頁, 發(fā)現(xiàn)有50多個session,。 2. 按CTRL+X將Fiddler中的所有session刪除,。 關(guān)閉firefox,重新打開一個firefox,打開博客園主頁,。 發(fā)現(xiàn)只有30多個session. 分析,; 少了的session是因為firefox直接用了緩存,,而沒有發(fā)http request。
如何設(shè)置IE不使用緩存打開IE,。點擊工具欄上的,, 工具->Internet選項->常規(guī)->瀏覽歷史記錄 設(shè)置. 選擇“從不”。然后保存,。 然后點擊“刪除” 把Internet臨時文件都刪掉 (IE緩存的文件就是Internet臨時文件),。
公有緩存和私有緩存的區(qū)別Cache-Control: public 指可以公有緩存, 可以是數(shù)千名用戶共享的,。 Cache-Control: private 指只支持私有緩存,, 私有緩存是單個用戶專用的。 |
|