本文想要解釋以下問題:
原始伺服器的內容可能會發生變化,快取要不時對其進行檢測,看看它們儲存的
副本是否仍是伺服器上最新的副本。這些「新鮮度檢測」被稱為
再驗證。
快取可以在任意時刻,以任意的頻率對副本進行再驗證。但由於快取中通常會包含數百萬的文件,而且網路頻寬是很珍貴的,所以大部分快取只有在客戶端發起請求,並且副本舊得足以需要檢測的時候,才會對副本進行再驗證。
為我們提供了幾個用來對已快取物件進行再驗證的工具,但最常用的是
if-modified-since
首部。將這個首部新增到
get請求中去,就可以告訴伺服器,只有在快取了物件的副本之後,又對其進行了修改的情況下,才傳送此物件。
這裡列出了在
3種情況下(伺服器內容未被修改,伺服器內容已被修改,或者伺服器上的物件被刪除了)伺服器收到
getif-modified-since
請求時會發生的情況:
• 再驗證命中
如果伺服器物件未被修改,伺服器會向客戶端傳送乙個小的
響應。
• 再驗證未命中
如果伺服器物件與已快取副本不同,伺服器向客戶端傳送一條普通的、帶有完整
內容的http 200 ok
響應。
• 物件被刪除
如果伺服器物件已經被刪除了,伺服器就回送乙個
404 not found
響應,快取也會將其副本刪除。
伺服器用
的expires
首部或http/1.1
的cache-control: max-age
響應首部來指定過期日期,同時還會帶有響應主體。
expires
首部和
cache-control:max-age
首部所做的事情本質上是一樣的,但由於
cache-control
首部使用的是相對時間而不是絕對日期,所以我們更傾向於使用比較新的
cache-control
首部。絕對日期依賴於計算機時鐘的正確設定。
在發現文件過期之後,就可以使用上述的新鮮度檢測方法對文件進行檢測。
有些情況下僅使用最後修改日期進行再驗證是不夠的。
為了解決這些問題,
允許使用者對被稱為
實體標籤
(etag
)的「版本識別符號」進行比較。實體標籤是附加到文件上的任意標籤(引用字串)。它們可能包含了文件的序列號或版本名,或者是文件內容的校驗和及其他指紋資訊。
當發布者對文件進行修改時,可以修改文件的實體標籤來說明這個新的版本。這樣,如果實體標籤被修改了,快取就可以用
if-none-match
條件首部來
get
文件的新副本了。
在圖 7-15
中,快取中有乙個實體標籤為
v2.6
的文件。它會與原始伺服器進行再驗證,如果標籤
v2.6
不再匹配,就會請求乙個新物件。在圖
7-15
中,標籤仍然與之
匹配,因此會返回一條
304 not modified
響應。
如果伺服器上的實體標籤已經發生了變化(可能變成了
v3.0
),伺服器會在乙個
200ok
響應中返回新的內容以及相應的新
etag。
可以在
if-none-match
首部包含幾個實體標籤,告訴伺服器,快取中已經存在帶
有這些實體標籤的物件副本:
if-none-match: "v2.6"
if-none-match: "v2.4","v2.5","v2.6"
if-none-match: "foobar","a34fac0095","profiles in courage"
沒有為使用者提供一種手段來區分響應是快取命中的,還是訪問原始伺服器得到的。在這兩種情況下,響應碼都是
200 ok
,說明響應有主體部分。有些商業**快取會在
via首部附加一些額外資訊,以描述快取中發生的情況。
客戶端有一種方法可以判斷響應是否來自快取,就是使用
date
首部。將響應中
date
首部的值與當前時間進行比較,如果響應中的日期值比較早,客戶端通常就可
以認為這是一條快取的響應。客戶端也可以通過
age首部來檢測快取的響應,通過這個首部可以分辨出這條響應的使用期 。
有些網路結構會構建複雜的
網狀快取
(cache mesh
),而不是簡單的快取層次結構。網狀快取中的**快取之間會以更加複雜的方式進行對話,做出動態的快取通訊決策,決定與哪個父快取進行對話,或者決定徹底繞開快取,直接連線原始伺服器。這種**快取會決定選擇何種路由對內容進行訪問、管理和傳送,因此可將其稱為
內容路由器
(content router)。
網狀快取中為內容路由設計的快取(除了其他任務之外)要完成下列所有功能。
快取之間這些更為複雜的關係允許不同的組織互為對等(
peer
)實體,將它們的快取連線起來以實現共贏。提供可選的對等支援的快取被稱為
兄弟快取
(siblingcache
)(參見圖
並不支援兄弟快取,所以人們通過一些協議對
進行了擴充套件,比如網際網路快取協議(
internet cache protocol
,icp
)和超文字快取協
議(hypertext caching protocol
HTTP協議與網路程式設計(三)HTTP快取機制
快取是一種儲存資源副本並在下次請求時直接使用該副本的技術 快取需要合理配置,並不是所有的資源都是永久不變的,他是有生命週期的 不能快取過期的資源 1 無快取機制 2 快取機制優勢 常見的http快取只能儲存get響應 只能用於單獨使用者 cache control private可以被多個使用者使用...
資料快取重新整理 5分鐘看懂系列 HTTP快取機制詳解
在闡述http不同快取策略之前,我們需要知道使用者重新整理 訪問行為 的手段分成三類 不同的重新整理手段,會導致瀏覽器使用不同的快取策略,我們下面會分析到 http 快取主要是通過請求和響應報文頭中的對應 header 資訊,來控制快取的策略。響應頭中相關欄位為expires cache contr...
App PHP快取抓取http快取
解決方案方案分為兩部分 業務線中讀取php快取,寫入redis 在指令碼中,取出redis快取 寫入log檔案 如下。var繼承的子類如有構造方法 記得呼叫父類方法 驗證登入 public function construct 記錄日誌 public function destruct page層使...