http頭部如何對快取的控制

HPhone發表於2015-09-29

文章自於我的個人部落格

使用快取的目的就是在於減少計算,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頭部如何對快取的控制

 

 

相關文章