『圖解HTTP』及『HTTP權威指南』關於緩存知識的筆記及總結。算法
減小冗餘的數據傳輸,節省網路費用
緩解了網絡瓶頸的問題,不須要更多的帶寬就可以更快的訪問頁面
下降了原始服務器的壓力,避免過載的出現
下降了距離時延,從較遠的地方加載頁面速度會更快一些瀏覽器
分爲三種狀況:緩存
直接從緩存中獲取資源,不須要給服務器發送HTTP請求,這種狀況下速度最快。status是from cache
服務器
向服務器發送一個請求來驗證緩存是否過時,若是沒過時,服務器返回304 Not Modified進行響應。客戶端獲得的仍然是緩存中的資源。網絡
服務器的資源與緩存副本不一樣,服務器向客戶端發送帶有完整內容的HTTP 200 OK的響應。相比於上述的304,傳輸的內容要更多一些。數據結構
若是服務器改資源已刪除,則發送一個404 Not Found響應,緩存也會將其副本刪除。優化
私有緩存是我的的緩存,包含單個用戶最經常使用的頁面。好比瀏覽器內建的私有緩存。網站
公有緩存是共享的緩存,包含某個用戶團體的經常使用頁面。代理
公有代理緩存是特殊的共享代理服務器,從本地緩存中獲取資源,或者表明用戶與服務器進行聯繫。能夠接受來自多個用戶的訪問,更好地減小冗餘流量。日誌
代理緩存的層次結構採用多層次的緩存結構,基本思想是在靠近客戶端的地方使用小型廉價緩存,而更高層次中,則逐步採用更大,功能更強的緩存來裝載多用戶共享的文檔。
瀏覽器自帶的緩存也是其中一個層次
緩存從網絡中讀取抵達的請求報文。
緩存將請求報文解析爲片斷,將首部的各個部分放入易操做的數據結構。這樣,緩存軟件就更容易處理首部字段並修改他們。
緩存獲取了URL,查找本地副本。本地副本可能存在內存,本地磁盤甚至附近的一臺計算機中。若是本地沒有這個文檔,它能夠根據情形和配置,到原始服務器或代理中去獲取,或者返回錯誤信息。
緩存文件在有效期內都認爲是新鮮的,緩存能夠在不聯繫服務器的狀況下,直接提供改文檔。一旦緩存停留的時間過長,超出了文檔的『新鮮度』,緩存就要與服務器進行確認,以查看改文檔是否發生了變化。
緩存的響應看起來像來自原始服務器同樣,緩存將已緩存的服務器響應首部做爲響應首部的起點,而後緩存對這些基礎首部進行了修改和擴充。
一旦響應首部準備好了,緩存就會將響應回送給客戶端。
大多數緩存都會保存日誌文件及與緩存的使用有關的一些統計數據。
If-Modified-Since
首部與Last-Modified
服務器響應首部配合工做。當緩存要對已緩存文檔進行再驗證時,就會包含一個If-Modified-Since
的首部,其中攜帶有最後修改已緩存副本的日期。若是緩存是新鮮的,就回返回304 Not Modified響應。
注意有些Web服務器並無將If-Modified-Since
做爲真正的日期來進行比較,而是進行字符串匹配。
有些狀況下僅使用最後修改日期是不夠的:
內容沒變,修改日期會發生變化。
有些文被修改了,但所作修改不重要,不須要讓世界範圍內的緩存都重裝數據。
有些服務器沒法準確斷定文件的最後修改日期。
有些服務器提供的文檔會在亞秒間隙內發生變化,以秒爲粒度的修改日期就不夠用了。
爲了解決以上問題,引入了實體標籤(ETag)的『版本標識符』進行比較。
If-None-Match
屬於請求頭字段,若是服務器斷定到If-None-Match
與請求資源的ETag一致,則不處理請求,返回304,客戶端可直接使用緩存。
ETag
是服務器響應頭部信息。
若是最後修改日期和實體標籤都提供了,就應該使用這兩種方案。只有都經過了才能使用緩存資源。
Cache-Control
是請求和響應的通用首部字段,可以控制緩存的行爲。
常見的一些取值及表明的含義
no-cache
該指令目的是防止使用緩存中過時的資源。
若是請求頭部包含no-cache指令,表示客戶端不接收緩存過的響應。中間緩存服務器必須將請求轉發給給源服務器。
瀏覽器強制刷新(window下ctrl+F5)就是這個原理,因此的請求都設置no-cache。
若是服務器返回的響應中包含no-cache指令,從字面意思很容易誤解未不緩存,但事實no-cache是能夠存儲在本地緩存中的,但在每次提供給客戶端使用以前,須要與原始服務器進行新鮮度驗證。
Pragma: no-cache
兼容HTTP/1.0+ ,要求全部的中間服務器不提供緩存。
no-store
使用no-store
指令,暗示請求和響應包含機密信息,不能進行緩存。
區分與no-cache的區別,no-store纔是真正的不緩存
max-age
該指令用來標識緩存資源的最大有效期。
當請求頭部中包含max-age
,若是緩存資源的緩存時間比指定數值小即代表緩存是有效的,那麼客戶端就接收緩存的資源,不會向源服務器發送請求。
不會向源服務器發送請求,這是一個很重要的點,能夠用於網站的優化。
若是max-age=0
,就會向源服務器發送請求進行緩存資源新鮮度的驗證。瀏覽器普通刷新F5
當服務器響應頭部中包含max-age
,其數值標識緩存的最長時間,在這個時間內緩存服務器再也不對資源進行新鮮度驗證。
s-maxage
其行爲與maxage
相似,僅適用於公有緩存。
有一個點總結下:在請求頭中
max-age=0
與no-cache
的區別?
返回的狀態來看:no-cache
都是200,而max-age
多是304(若是瀏覽器有緩存)。
請求參數:max-age
請求頭通常會攜帶If-Modified-Since
或If-None-Match
字段進行新鮮度驗證,而no-cache
不會攜帶。
F5刷新是max-age=0
來實現,而強制刷新(Ctrl+F5)是經過no-cache
實現。
Expires
是HTTP 1.0+的首部,用來指定一個絕對的過時日期,依賴客戶端時間設置的準確性。
而max-age
是HTTP/1.1的Cache-Control
的一個字段,用來指定文檔的最大使用時間。
若是響應中既沒有包含Cache-Control:max-age
首部,也沒有Expires
首部,緩存能夠計算出一個試探性最大使用日期。
LM-Factor
算法一種經常使用的試探性過時算法,該算法將最後修改日期做爲依據,來估計文檔有多麼易變。
侷限性:只支持HTML,不支持不少其餘的文件類型,不多有Web服務器和代理支持此特性。