Web緩存

『圖解HTTP』及『HTTP權威指南』關於緩存知識的筆記及總結。算法

緩存的優勢

減小冗餘的數據傳輸,節省網路費用
緩解了網絡瓶頸的問題,不須要更多的帶寬就可以更快的訪問頁面
下降了原始服務器的壓力,避免過載的出現
下降了距離時延,從較遠的地方加載頁面速度會更快一些瀏覽器

緩存的命中

分爲三種狀況:緩存

緩存命中

直接從緩存中獲取資源,不須要給服務器發送HTTP請求,這種狀況下速度最快。status是from cache服務器

緩存再驗證命中

向服務器發送一個請求來驗證緩存是否過時,若是沒過時,服務器返回304 Not Modified進行響應。客戶端獲得的仍然是緩存中的資源。網絡

緩存再驗證未命中

服務器的資源與緩存副本不一樣,服務器向客戶端發送帶有完整內容的HTTP 200 OK的響應。相比於上述的304,傳輸的內容要更多一些。數據結構

資源被刪除

若是服務器改資源已刪除,則發送一個404 Not Found響應,緩存也會將其副本刪除。優化

緩存的拓撲結構

私有緩存是我的的緩存,包含單個用戶最經常使用的頁面。好比瀏覽器內建的私有緩存。網站

公有緩存是共享的緩存,包含某個用戶團體的經常使用頁面。代理

公有代理緩存是特殊的共享代理服務器,從本地緩存中獲取資源,或者表明用戶與服務器進行聯繫。能夠接受來自多個用戶的訪問,更好地減小冗餘流量。日誌

代理緩存的層次結構採用多層次的緩存結構,基本思想是在靠近客戶端的地方使用小型廉價緩存,而更高層次中,則逐步採用更大,功能更強的緩存來裝載多用戶共享的文檔。

瀏覽器自帶的緩存也是其中一個層次

緩存的處理步驟

接收

緩存從網絡中讀取抵達的請求報文。

解析

緩存將請求報文解析爲片斷,將首部的各個部分放入易操做的數據結構。這樣,緩存軟件就更容易處理首部字段並修改他們。

查找

緩存獲取了URL,查找本地副本。本地副本可能存在內存,本地磁盤甚至附近的一臺計算機中。若是本地沒有這個文檔,它能夠根據情形和配置,到原始服務器或代理中去獲取,或者返回錯誤信息。

新鮮度檢測

緩存文件在有效期內都認爲是新鮮的,緩存能夠在不聯繫服務器的狀況下,直接提供改文檔。一旦緩存停留的時間過長,超出了文檔的『新鮮度』,緩存就要與服務器進行確認,以查看改文檔是否發生了變化。

建立響應

緩存的響應看起來像來自原始服務器同樣,緩存將已緩存的服務器響應首部做爲響應首部的起點,而後緩存對這些基礎首部進行了修改和擴充。

發送

一旦響應首部準備好了,緩存就會將響應回送給客戶端。

日誌

大多數緩存都會保存日誌文件及與緩存的使用有關的一些統計數據。

緩存的再驗證

If-Modified-Since: Date再驗證

If-Modified-Since首部與Last-Modified服務器響應首部配合工做。當緩存要對已緩存文檔進行再驗證時,就會包含一個If-Modified-Since的首部,其中攜帶有最後修改已緩存副本的日期。若是緩存是新鮮的,就回返回304 Not Modified響應。

注意有些Web服務器並無將If-Modified-Since做爲真正的日期來進行比較,而是進行字符串匹配。

If-None-Match: 實體標籤再驗證

有些狀況下僅使用最後修改日期是不夠的:

  • 內容沒變,修改日期會發生變化。

  • 有些文被修改了,但所作修改不重要,不須要讓世界範圍內的緩存都重裝數據。

  • 有些服務器沒法準確斷定文件的最後修改日期。

  • 有些服務器提供的文檔會在亞秒間隙內發生變化,以秒爲粒度的修改日期就不夠用了。

爲了解決以上問題,引入了實體標籤(ETag)的『版本標識符』進行比較。

If-None-Match屬於請求頭字段,若是服務器斷定到If-None-Match與請求資源的ETag一致,則不處理請求,返回304,客戶端可直接使用緩存。

ETag是服務器響應頭部信息。

若是最後修改日期和實體標籤都提供了,就應該使用這兩種方案。只有都經過了才能使用緩存資源。

緩存的控制

Cache-Control

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=0no-cache的區別?
返回的狀態來看:no-cache都是200,而max-age多是304(若是瀏覽器有緩存)。
請求參數:max-age請求頭通常會攜帶If-Modified-SinceIf-None-Match字段進行新鮮度驗證,而no-cache不會攜帶。
F5刷新是max-age=0來實現,而強制刷新(Ctrl+F5)是經過no-cache實現。

Expires

Expires是HTTP 1.0+的首部,用來指定一個絕對的過時日期,依賴客戶端時間設置的準確性。
max-age是HTTP/1.1的Cache-Control的一個字段,用來指定文檔的最大使用時間。

試探性過時

若是響應中既沒有包含Cache-Control:max-age首部,也沒有Expires首部,緩存能夠計算出一個試探性最大使用日期。

LM-Factor算法一種經常使用的試探性過時算法,該算法將最後修改日期做爲依據,來估計文檔有多麼易變。

使用HTTP-EQUIV來控制HTML緩存

侷限性:只支持HTML,不支持不少其餘的文件類型,不多有Web服務器和代理支持此特性。

相關文章
相關標籤/搜索