摘要:原始服務器的內容可能會發生變化,緩存要不時對其進行檢測,被稱為再驗證。的確切行為取決于特定的瀏覽器文檔以及攔截緩存的配置。中正常重新加載會強制對緩存的文檔副本進行再驗證,硬性重新加載則直接跳過緩存從原始服務器請求文檔
web緩存可以自動保存常見文檔副本,當web請求抵達緩存時,如果本地有已緩存的副本,就可以從本地存儲設備而不是原始服務器中提取這個文檔。使用緩存可以減少冗余的數據傳輸、緩解網絡瓶頸問題、降低對原始服務器的要求和降低距離時延。
可以用已有的副本為某些到達緩存的請求提供服務,被稱為緩存命中(cache hit),若請求沒有副本可用,被轉發給原始服務器,被稱為緩存未命中(cache miss)。原始服務器的內容可能會發生變化,緩存要不時對其進行檢測,被稱為http再驗證(revalidation)。
對緩存的副本進行再驗證時,會向原始服務器發送一個小的再驗證請求,如果內容沒有變化,服務器會以一個小的304 Not Modified進行響應,副本依然有效,被再次標識為暫時新鮮的,并將副本提供給客戶端,這被稱為再驗證命中或緩慢命中,這種方式比單純的緩存命中要慢。
緩存處理步驟對一條http GET報文的基本緩存處理包括7個步驟:
1、接收
緩存從網絡中讀取抵達的請求報文
2、解析
緩存對報文進行解析,提取出URL和各種首部
3、查詢
查看是否有本地副本可用,如果沒有,就獲取一份副本,并將其保存在本地。
4、新鮮度檢測
http通過緩存將服務器文檔的副本保留一段時間,在這段時間里,都認為文檔是新鮮的,緩存可以在不聯系服務器的情況下直接提供該文檔。但一旦已緩存副本停留時間太長,超過了文檔的新鮮度限值,就認為對象過時了,在提供該文檔之前,緩存要再次與服務器進行確認,以查看文檔是否發生了變化。客戶端發送給緩存的所有請求首部自身都可以強制緩存進行再驗證,或者避免驗證。
5、創建響應
緩存會用新的首部和已緩存的主體來構建一條響應報文。緩存會向其中插入新鮮度信息(Cache-Control、Age、Expires),并且通常會包含一個Via首部來說明請求是由一個代理緩存提供的。
6、發送
通過網絡將響應發回給客戶端
7、日志
可選地創建一個日志文件條目來描述這個事務
http有一些簡單的機制可以在不要求服務器記住有哪些緩存擁有其文檔副本的情況下保持已緩存數據與服務器數據之間充分一致。http將這些簡單的機制稱為文檔過期和服務器再驗證。
文檔過期通過http Cache-Control(http/1.1)和Expires(http/1.0+)首部,http讓原始服務器向每個文檔附加了一個過期日期,這些首部說明了在多長時間內可以將這些內容視為新鮮的。在緩存文檔過期前,可以以任意頻率使用這些副本,而無需與服務器聯系,除非客戶端請求中包含有阻止提供已緩存或未驗證資源的首部。一旦已緩存文檔過期,緩存就必須與服務器進行核對,詢問文檔是否被修改過,如果被修改過,就要獲取一份新鮮的副本。由于絕對日期依賴于計算機時鐘的正確設置,一般更傾向于使用Cache-Control相對日期。
Cache-Control:no-Store
標識為no-store的響應會禁止保存文檔副本
Cache-Control:no-Cache
標識為no-cache的響應實際上時是可以存儲本地緩存的,只是在與原始服務器進行新鮮度再驗證之前,緩存不能提供給客戶端使用
Cache-Control:must-revalidate
可以配置緩存,使其提供一些陳舊(過期)的對象,如果原始服務器希望嚴格遵守過期信息,可以增加must-revalidate首部
如果響應中沒有Cache-Control:max-age首部,也沒有Expires首部,緩存可以計算出一個試探性最大試用期。LM-Factor算法是一種常見試探性過期算法,如果文檔中包含了最后修改日期,就可以使用這種算法。LM-Factor算法將最后修改日期作為依據,來估計文檔有多易變。算法邏輯如下:
1、如果已緩存文檔最后一次修改發生在很久以前,它可能是一份穩定的文檔,不太會突然發生變化,因此將其繼續保存正在緩存中比較安全
2、如果已緩存文檔最近被修改過,說明它很可能會頻繁地發生變化,因此在與服務器進行再驗證之前,只應該將其緩存很短一段時間
實際的LM-Factor算法會計算緩存與服務器對話的時間跟服務器聲明文檔最后被修改的時間之間的差值,取這個間隔時間的一部分,將其作為緩存中的新鮮度持續時間。如果最后修改日期也沒有的話,通常會為沒有任何新鮮周期線索的文檔分配一個默認的新鮮周期(一個小時或一天)。有時,比較保守的緩存會將這種試探性新鮮生存周期設置為0,強制在每次將其提供給客戶端之前都去驗證。
服務器再驗證緩存文檔過期,意味著到了進行核對的時間,需要詢問原始服務器文檔是否發生了變化。這種情況被稱為服務器再驗證。如果在驗證顯示內容發生了變化,緩存會獲取一份新的文檔副本,取代舊的文檔副本,然后將文檔發送給客戶端;如果再驗證顯示內容沒有變化,緩存只需要獲取新的首部,包括一個新的過期日期,并對緩存中的首部進行更新。
用條件方法進行再驗證http允許緩存向原始服務器發送一個“條件GET”,使服務器只有在文檔與緩存中現有副本不同時,才回送對象主體,常用的兩個首部是If-Modified-Since和If-None-Match。如果服務器收到的請求既帶有If-Modified-Since又有If-None-Match,那么只有這兩個條件都滿足時,才返回304.
If-Modified-SinceIf-Modified-Since再驗證請求通常被稱為IMS請求,可以與Last-Modified首部配合工作,參是數一個日期。如果自指定日期后,文檔被修改了,Get請求就會成功執行,返回新的文檔,新文檔會包括一個新的過期日期。如果文檔沒有被修改,條件為假,客戶端會收到一個304 Not Modified響應報文,一般會發送一個新的過期日期。
If-None-Match有些情況僅使用最后修改日期再驗證是不夠的。
有些文檔可能會被周期性地重寫,但實際包含的數據是一樣的,盡管內容沒有變化,但修改日期會發生變化
有些文檔可能被修改了,但所做修改并不重要,不需要讓世界范圍的緩存都重裝數據(例如對拼寫或注釋的修改)
有些服務器無法準確地判定文檔的最后修改日期
有些服務器提供的文檔會在亞秒間隙發生變化,對這些服務器來說,以秒為粒度的修改日期就不夠用了
為了解決這些問題,http允許用戶對被稱為實體標簽(ETag)的“版本標識符”進行比較。實體標簽是附加到文檔上的任意標簽,它們可能包含了文檔的序列號或版本名,或者是文檔內容的校驗和其他指紋信息。當發布者對文檔進行修改時,可以修改文檔的實體標簽來說明這個新的版本,緩存就可以用If-None-Match條件首部來請求文檔的新副本了。
瀏覽器控制瀏覽器中通常有refresh(刷新)和reload(重載)機制,可以強制對瀏覽器或代理緩存中可能過期的內容進行刷新。refresh操作會發布一個附加了Cache-Control請求首部的GET請求,這個請求會強制進行再驗證,或者無條件地從服務器獲取文檔。refresh的確切行為取決于特定的瀏覽器、文檔以及攔截緩存的配置。
Chrome中正常重新加載會強制對緩存的文檔副本進行再驗證,硬性重新加載則直接跳過緩存從原始服務器請求文檔
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/62142.html
摘要:在此,我會嘗試用簡單明了的文字,像大家系統的介紹緩存機制,期望對各位正確的理解前端緩存有所幫助。兩類緩存規則可以同時存在,強制緩存優先級高于對比緩存,也就是說,當執行強制緩存的規則時,如果緩存生效,直接使用緩存,不再執行對比緩存規則。 前言 在請求一個靜態文件的時候(圖片,css,js)等,這些文件的特點是文件不經常變化,將這些不經常變化的文件存儲起來,對客戶端來說是一個優化用戶瀏覽體...
摘要:在此,我會嘗試用簡單明了的文字,像大家系統的介紹緩存機制,期望對各位正確的理解前端緩存有所幫助。兩類緩存規則可以同時存在,強制緩存優先級高于對比緩存,也就是說,當執行強制緩存的規則時,如果緩存生效,直接使用緩存,不再執行對比緩存規則。 前言 在請求一個靜態文件的時候(圖片,css,js)等,這些文件的特點是文件不經常變化,將這些不經常變化的文件存儲起來,對客戶端來說是一個優化用戶瀏覽體...
摘要:規則使用內容發布網絡用戶同服務器的距離會對頁面響應時間產生影響。這不僅能達到響應時間大幅減少的目的,還很容易實現。提供動態頁面會引入特殊的存儲要求數據庫連接狀態管理驗證硬件和優化等,這些復雜性超過了的范圍。 鏈接參考: https://developer.yahoo.com/performance/rules.html 只有10%~20%的最終用戶響應時間花在了下載HTML文檔上...
閱讀 3077·2023-04-26 00:53
閱讀 3522·2021-11-19 09:58
閱讀 1693·2021-09-29 09:35
閱讀 3279·2021-09-28 09:46
閱讀 3852·2021-09-22 15:38
閱讀 2692·2019-08-30 15:55
閱讀 3006·2019-08-23 14:10
閱讀 3822·2019-08-22 18:17