使用緩存的目的就是在於減少計算,IO,網絡等時間,可以快速的返回,特別是流量比較大的時候,可以節約很多服務器帶寬和壓力。
一個請求從緩存的方面來說,有三個過程。
本地檢查緩存是否過期
Expires,http 1.0版本定義的response頭部,定義過期時間,如果本地時間發現超過過期時間,就會向服務器請求,進行文件新鮮度檢測。但是會有一個問題,就是本地的操作系統時間可能偏差比較大,導致緩存時間過長或者永遠都緩存不了。
Cache-control: max-age,http 1.1 版本定義的response頭部,就是為了解決操作系統時間與服務器時間相差太大問題。文件緩存存活時間,請求完畢的時候,會記錄本地的時間。再次請求的時候,此時時間減去最初記錄時間,如果時間大於max-age,就會進行文件新鮮度檢測。
- 如果瀏覽器使用本地緩存,通過chrome調試工具,可以看到,狀態是200,size 是from cache。這個時候是沒有http請求。
- 如果緩存不存在或者沒有定義這兩個頭部,直接進行下一步新鮮度檢測。
- 如果兩個都定義的話,Expires無效。
- 防止瀏覽器緩存,我們需要把兩個頭部都設置為0.
服務器檢測文件新鮮度
本地緩存過期,緩存和服務器文件可能一樣,也有可能不一樣。如果一樣的話,就沒有必要返回內容。如果不一樣,就返回內容,就相當於一次新的請求。
怎么判斷文件是否一致呢?現在的做法通過文件生成時間或者對文件進行MD5值計算。
Last-Modified,文件生成時間或者最后修改時間。下一次請求的頭部,添加If-Modified-Since,值是上次respone頭部的Last-Modified值,和服務器進行對比,如果一樣的話,直接返回304,數據內容為空。【這里也會存在一個問題,如果文件定期更新,但是文件內容不更新,豈不是白白耗費流量。】
Etag , 服務器端對文件計算出來的一個值。下一次請求的頭部,添加If-None-Match,和服務器進行對比,如果一樣的話,直接返回304,數據內容為空。
服務器返回數據內容
相當於一次新的請求,狀態是200.
通過輸出4個頭部,來控制緩存,減少壓力,不僅可以節省服務器和寬帶資源,對用戶的體驗提升也是非常有幫組的。
整體上,可以看到可能出現的情況。200(from cache,無請求),304(僅僅是頭部交換,沒有response body返回),200(一次完整的請求,包含response body)。
轉載請注明:萬馬奔騰 » http頭部如何對緩存的控制