HTTP缓存剖析
web瀏覽器會自動緩存訪問過的頁面,當訪問同一個頁面的請求時,瀏覽器不再從服務器中重新下載頁面而是優先使用本地緩存中的頁面
為什么要進行web緩存
從用戶的角度來看web緩存加快了上網速度,當然這是用戶主觀認為的增加了上網速度,從設計者的角度來看:
1.網絡帶寬的限制,也就是說在單位時間內,用戶從網絡上獲取的信息是有著上限的,這就限制了用戶的上網速度,而緩存可以造成一種加快上網速度的假象;
2.緩存可以有效的減少網絡冗余信息的傳輸,即同一個頁面如果用戶每個一段時間就刷新一次,服務器中的頁面并沒有發生變化,如果用戶每刷新一次服務器就傳送一個新的頁面這就造成了數據的冗余;
3.緩存可以有效地削弱瞬間擁塞現象;瞬間擁塞可能造成整個網絡和服務器的崩潰;
雖然緩存有著種種好處,但是緩存并不是簡簡單單地在本地存儲一個頁面,緩存首先要面對的一個現實問題即網絡上有海量的頁面,總不能都緩存吧;為了解決這個問題,提出了緩存命中的概念(緩存命中這個概念顯然是一個舶來品)所謂的緩存命中是指當一個請求所需的頁面在本地緩存中,并且經過檢測緩存的頁面并沒有在服務器發生變化,瀏覽器將使用本地緩存的頁面(緩存頁面的再檢測也稱為緩存頁面的保鮮度,當瀏覽器發現所需的頁面在本地緩存中,為了確定頁面是否是最新的頁面時,瀏覽器將向服務器發送一個請求詢問頁面是否是最新的,最新的依據就是頁面的最后修改時間,若服務器發現頁面是最新的,則返回一個應答,若發現頁面不是最新的將會把最新的頁面發送給瀏覽器)
緩存服務器
若將緩存單獨地存放在一個服務器中,就形成了緩存服務器,緩存服務器的拓撲結構多種多樣,有層次結構、網狀結構和對等結構等,但是緩存服務器的處理流程基本相同:
新鮮度
頁面總是可能隨時間發生變化的,那如何保證頁面總是最新的那?http協議提供文檔過期時間和服務器再驗證;
文檔過期時間:
服務器再驗證
當文檔的到期時間到了,但并不能說明文檔在服務器端也發生了變化,因此此時就需要瀏覽器向服務器進行再驗證,注意當服務器已經掛掉了,而緩存又需要驗證,緩存就要返回一條錯誤信息;
條件驗證
Http允許緩存向原始服務器發送一個條件get,將新鮮度檢測和獲取對象合并成一個get請求,請求服務器只有在文檔和緩存的文檔不一致時才會返回新的文檔。
If-Modified-Since:<date> 如果從指定日期之后文檔被修改過,就執行請求方法,可以與last—Modified服務器響應首部配合使用,只有在內容被修改后與已緩存的版本不同的時候才去獲取內容。
If-None-Math:<tags>服務器可以提供特殊的標簽,而不是將其與最近的修改日期相匹配,這些標簽就像序列號一樣,如果已緩存的標簽和服務器的標簽不同,則執行請求的方法,返回新的內容。緩存設置
cache-control:no-store表示不再緩存中緩存文檔
cache-control:no-cache表示可以在本地緩存文檔,但在新鮮度檢測之前不得返給瀏覽器,不管文檔是否過期;
cache-control:maxage表示文檔的最大緩存時間
Expire:表示文檔的過期時間
cache-control:must-revaildate表示在文檔過期后,必須進行新鮮度檢測后才能返回給瀏覽器
探測性過期算法:
如果未設置cache-control,且文檔有緩存線索即最后修改日期,瀏覽器可以運行探測性算法計算出一個大概的日期,其中LM-Factor算法如下:
廣告商的困勁
1.緩存清楚
2.緩存日志
3.命中計數
總結
- 上一篇: Knock Knock,这里有一封全球技
- 下一篇: Cloud Lab: 泰晓实验云台【转】