http頭部如何對緩存的控制


文章自於我的個人博客

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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM