天天看點

《HTTP權威指南》讀書筆記:緩存 緩存的定義

web緩存是可以自動儲存常見文檔副本的http裝置(包括浏覽器?)

減少備援資料傳輸

緩解帶寬瓶頸(很多網絡為本地網絡用戶端提供的帶寬比為遠端伺服器提供的帶寬要寬)

緩解瞬時擁塞(不會所有的請求都奔着一台伺服器去)

降低距離時延(就近通路麼)

命中率:請求命中緩存的比例

位元組命中率:請求命中緩存的文檔,其文檔大小總和,占所有請求大小總和的比例(一些大文檔盡管通路少,但對流量貢獻大,對于按流量計費的人來說很重要)

用戶端如何判斷請求是否命中緩存:它能夠過date首部,如果date的值比目前日期值要早,那麼可以認為是緩存的響應。

http通過以下兩種機制來實作這樣的目的:不要求伺服器記住哪些緩存擁有資源副本,同時保持已緩存資料與伺服器資料之間的一緻。

http 1.0引入,指定實際的過期時間,而不是秒數。不推薦使用,原因:很多伺服器的始終不同步或不正确。使用舉例:

從伺服器将資源傳送過來時算起,文檔處于新鮮的時間(機關為秒)。可通過将其設為0,來請求緩存(伺服器)不要緩存資源。舉例:

名字比較有歧義,實際表達的意思是:緩存(伺服器)在與原始伺服器進行新鮮度再驗證前,不能将資源提供給用戶端使用。這裡包含兩個點:

辨別為<code>no-cache</code>的響應實際是可以存儲在本地緩沖區的

必須每次與原始伺服器再校驗

舉例:

帶有<code>no-store</code>的響應,會禁止緩存對資源進行複制。緩存向用戶端轉發<code>no-store</code>響應後,會将副本删除。

可以使用陳舊(過期)的資源以提高性能。但在沒有與原始伺服器進行再驗證的情況下,不能使用資源的陳舊副本。

與<code>no-cache</code>的差別:

<code>no-cache</code>:無論資源副本是否過期,都必須與原始伺服器進行校驗

<code>must-revalidate</code>:資源副本過期前,無需校驗;過期後,須校驗,如原始伺服器上的資源沒變化,那麼緩存可以提供陳舊的副本。(減少資源傳輸)

詢問伺服器,資源在<code>if-modified-since</code>指定的時間之後,是否被修改了,如果

沒被修改:傳回<code>304 not modified</code>響應封包,同時隻會發送需要在源端更新的首部,比如新的過期時間。

被修改了:攜帶新首部的資源會被傳回給緩存,包括新的過期時間。

例子:

etag:實體标簽(entity tag)。etag再驗證的原因:

有些文檔會被周期性地重寫,但實際包含的資料常常是一樣的,但修改時間已經發生變化。

文檔被修改了,但修改并不重要,不需要讓所有緩存都失效。

某些伺服器無法準确判斷資源的最後修改時間。

流程與<code>if-modified-since</code>差不多,帶上<code>etag</code>去伺服器查詢,如果

etag發生變化:傳回帶有新etag的資源

etag沒變化:傳回304 not modified