騰訊DeepOcean原創文章:http://dopro.io/http-cache-and-cdn-cache.html
配置http緩存與cdn緩存一直以來都是web性能優化中重要而常見的手段。合理的http緩存與cdn緩存配置可以起到減輕伺服器壓力,緩解網路瓶頸,提升用戶體驗等作用,不當的緩存配置卻會導致資源無法及時更新,用戶體驗差異,甚至流程出錯等問題。本文主要講解http緩存與cdn緩存的原理和配置規則,希望通過本文的講解能夠讓大家清楚什麼是合理的緩存配置,如何為自己的項目定製化緩存方案,以及如果碰到緩存問題,應該如何分析解決。
首先,讓我們來看這樣一個場景
項目A上線了一個新特性,包含著邏輯的改動和頁面UI的更新,小明作為項目開發將代碼提交後進行了預發布。產品經理小紅開始體驗新特性,奇怪的是,小紅進入項目後卻並沒有看到最新的特性,這時小明思考了一會說,小紅你點擊刷新再試試,果然,刷新後項目有了變化,新特性出來了,但是這時又有了新的問題,項目里的圖片似乎還是舊圖,小明又思考了一會,隨後在電腦前搗鼓一番,讓小紅再次體驗,終於,這個時候特性完整驗收通過。上述的案例中,其實就包含著http緩存和cdn緩存的應用,當然,這是一個反面教材,實際上線過程中,我們不可能讓每一個用戶點擊刷新來體驗我們的新特性,那應該如何解決上述問題呢,接下來上乾貨。
http緩存
簡介
http緩存是客戶端緩存,瀏覽器作為客戶端接受到服務端響應後,對於響應首部欄位進行解析,分析出相應的緩存規則,將資源按規則進行緩存,再次請求時如果命中緩存則直接讀取本地緩存不再發出請求。
緩存規則
http緩存規則由響應首部欄位進行控制,其中的關鍵欄位有Expires,Cache-Control ,Last-Modified ,Etag 四個欄位,Expires和Cache-Control用來確定確定緩存的存儲時間,Last-Modified 和Etag則用來確定緩存是否要被更新,我們簡單來看一下區別。
- expires: HTTP1.0中用來控制緩存時間的參數,響應頭包含日期/時間, 即在此時間之後,響應過期。
- cache-control: HTTP1.1中用來控制緩存時間的參數
- public: 表明響應可以被任何對象(包括:發送請求的客戶端,代理伺服器,等等)緩存。
- private: 表明響應只能被單個用戶緩存,不能作為共享緩存(即代理伺服器不能緩存它)。
- max-age=<seconds>: 設置緩存存儲的最大周期,相對於請求的時間緩存seconds秒,在此時間內,訪問資源直接讀取本地緩存,不向伺服器發出請求。(與expires同時出現時,max-age優先順序更高)
- s-maxage=<seconds>: 規則等同max-age,覆蓋max-age 或者 Expires 頭,但是僅適用於共享緩存(比如各個代理),並且私有緩存中它被忽略。(與expires或max-age同時出現時,s-maxage優先順序更高)
- no-store: 不緩存伺服器響應的任何內容,每次訪問資源都需要伺服器完整響應
- no-cache: 緩存資源,但立即過期,每次請求都需要跟伺服器對比驗證資源是否被修改。(等同於max-age=0)
- Last-modified: 源頭伺服器認定的資源做出修改的日期及時間。精確度比Etag低。包含有If-Modified-Since或 If-Unmodified-Since首部的條件請求會使用這個欄位。
- Etag: HTTP響應頭是資源的特定版本的標識符。
我們通過chrome控制台可以很輕鬆的找到一個案例: