HTTP緩存

1、緩存

  緩存是一種保存資源副本,並且在下次請求時直接使用該副本的一項技術。

  當WEB緩存發現請求的資源已經被存儲,他會攔截請求,返回該資源的拷貝,而不會去服務器重新下載請求。

  對於網站來說,緩存時達到高性能的重要組成部分。緩存需要合理的配置,並不是所有的資源都是永久不變的,不能緩存過期的資源,資源的生命週期應該截止到資源下一次改變之前。

  http緩存不是必須的,但是重用緩存的資源時必須的。常見的http緩存只能存儲GET響應,對於其他類型的響應無能爲力。

  緩存的關鍵是request method和目標URI。

2、緩存的好處
緩解服務器壓力,提升性能,減少獲取資源的時間。
3、緩存的分類

  緩存分爲強緩存和協商緩存。

3-1、強緩存

  強緩存可以通過兩種響應頭實現,分別爲Expires和Cache-Control。強緩存表示在緩存期間不需要請求,且state code的值爲200。

  # 【實現】
Expires: time;
    - 表示在指定時間之後過期,需要再次請求;
    - Expires緩存時間的設置受限於本地時間,如果修改本地時間,有可能會導致緩存失效。
    
Cache-Control:max-age=20;
    - 表示資源會在20s之後過期,需要再次請求;
    - 優先級高於Expires;
3-2、協商緩存

  協商緩存需要請求,如果資源有效則會返回304,協商緩存需要客戶端和服務端共同實現。

  # 【實現】
Last-Modified和If-Modified-Since:
    - Last-Modified表示本地文件最後的修改日期;
    - If-Modified-Since會將Last-Modified的值發送給服務器,詢問服務器該日期之後,資源是否有更新,如果更新則返回新的資源;
    - 但是如果在本地打開緩存文件,就會造成Last-Modified被修改;
    
ETag和If-None-Match:
    - ETag類似於文件指紋;
    - If-None-Match會將當前ETag發送給服務器,詢問該資源的ETag是否變動,如果變動就返回新的資源;
    - ETag的優先級高於Last-Modified;
4、緩存的分類2
緩存一般分爲私有緩存和共享緩存;
共享緩存存儲的響應能夠被多個用戶使用,而私有緩存只能用於單個用戶。
4-1、瀏覽器緩存
- 瀏覽器緩存屬於私有緩存,只能用於單獨的用戶;
- 瀏覽器緩存擁有用戶通過HTTP下載的所有文檔,這些緩存可以爲瀏覽過的文檔提供向前或者向後導航,保存網頁、查看源碼等功能;可以避免向服務器發起多餘的請求。
4-2、代理緩存
- 代理緩存屬於共享緩存,可以被多個用戶使用;
- 設置一個web代理來作爲本地網絡基礎的一部分提供給用戶。熱門的資源就會被重複使用,減少網絡的擁堵和延遲。
4-3、其他緩存
CDN緩存、反向代理緩存、負載均衡器
5、緩存控制
通過Cache-Control來定義緩存策略。
5-1、禁止緩存

  緩存中不得存儲任何關於客戶端請求和服務端響應的內容。每次由客戶端發起的請求都會下載完整的響應內容。設置如下:
Cache-Control: no-store;
Cache-Control: no-cache,no-store;

5-2、強制確認緩存

  每次客戶端發出請求時,緩存會將此請求發送到服務器,該請求會帶有與本地緩存相關的驗證字段,服務器端會驗證請求中所描述的緩存是否過期,如果沒有過期,則緩存才能使用本地緩存;否則就會從服務器重新獲取資源。設置如下:
Cache-Control: must-revalidate;

5-3、私有緩存和共享緩存
【public】指令表示該響應可以被任何中間人緩存,比如:中間代理,CDN等。
         如果指定了public,則帶有HTTP驗證信息的頁面或者具有某些特定影響狀態碼的頁面將會被其緩存。
【private】指定表示該響應時專用於某個單個用戶的,中間人不能緩存此響應,該響應只能用於瀏覽器私有緩存中。

設置如下:
    Cache-Control: private
    Cache-Control: public
5-4、緩存過期機制

  【max-age=seconds】表示資源能夠被緩存的最大時間,相對於expires而言,max-age時距離請求發起的時間的秒數。

  通常可以給那些不經常改變的文件,設置一定的時長以保證緩存有效,例如:圖片、css、js等靜態資源。

設置實現:
Cache-Control: max-age=2222222;
5-5、緩存驗證確認

  【must-revalidate】指令,表示在使用一個陳舊的資源時,必須先驗證它的狀態,已經過期的緩存將不在被使用。

設置方式
Cache-Control: must-revalidate
6、緩存約定

  從理論上來講,當一個資源被緩存存儲之後,該資源應該可以被永久存儲在緩存中。但是由於緩存的空間有限,所以緩存會定期將一些副本刪除,這個過程叫做緩存驅逐。

  由於HTTP是C/S模式的協議,當服務器更新一個資源時,不可能直接通知客戶端及其緩存。所以雙方必須爲該資源約定一個過期時間,超過約定的時間,則該資源就會變爲無效的資源。

  然後驅逐算法就會將陳舊的資源替換爲新鮮的資源。

  一個陳舊的資源並不會直接被清除或者忽略,當客戶端發起一個請求時,緩存檢索到已有一個對應的陳舊資源(緩存副本),則緩存會先將此請求附加一個If-None-Match頭,然後發給目標服務器。

  如果服務器返回304,則表示該資源是有效的,客戶端就會直接使用緩存資源,可以節省帶寬。如果服務器發現該資源已經過期,那麼服務器就會將帶有該資源的實體內容返回給客戶端。

7、緩存的過程

  瀏覽器第一次加載資源,服務器返回200,瀏覽器將資源文件從服務器上請求下載下來,並把response header和該請求的返回時間一併緩存。

  下一次加載資源時,先比較當前時間和上一次返回200時的時間差。如果沒有超過Cache-Control設置的max-age,則表示資源沒有過期,可以繼續使用,命中強緩存,不發請求直接從本地緩存讀取該文件;如果瀏覽器不支持HTTP/1.1,則用Expires判斷是否過期;如果資源過期,則向服務器發送header帶有If-None-Match和Modified-Since的請求。

  服務器收到請求後,優先根據ETag的值判斷被請求的文件有沒有被修改,ETag值一致則沒有修改,命中協商緩存,返回304;如果不一致,則表示有改動,直接返回新的資源文件,帶上新的ETag並且返回200。

  如果服務器收到的請求沒有ETag值,則將If-Modified-Since和被請求文件的最後修改時間做對比,一致則命中協商緩存,返回304;不一致則返回新的last-Modified和文件並返回200。

8、TTFB
8-1、什麼是TTFB?

  TTFB全稱Time to First Byte,指的是瀏覽器開始收到服務器響應數據的時間,包含後臺處理時間和重定向時間,是反映服務器端響應速度的重要指標。TTFB時間越短,說明服務器響應速度越快。

8-2、TTFB過長的原因

  對於動態網頁來說,服務器收到用戶打開一個頁面的請求時,首先要從數據庫中讀取該頁面需要的數據,然後把數據傳入到模版中,模版渲染成功之後,再返回給用戶。由於查詢數據和渲染模板需要一定的時間,在這個過程沒有完成之前,瀏覽器就一致處於等待接收服務器響應的狀態。

- 如果服務器性能較低,或者優化沒有做好,這個時間就會比較長;
- 如果服務器到用戶之間的網絡不好,服務器接收到用戶請求的時間較長,也會導致TTFB時間過長;
- 用戶在瀏覽器中保存了較多的cookie,每次請求,cookie都會發送到服務器,服務器需要處理這些cookie,也會導致TTFB時間過長;
8-3、解決辦法
- 使用緩存,把PHP和mysql的執行時間最小化,緩存SQL查詢結果,把十幾次查詢結果轉換爲幾次;
- 把用戶所請求的頁面靜態化,用戶打開網頁時,相當於直接從服務器上下載了靜態頁面;
- 如果是網絡原因,則可以替換服務器;
- 可以使用CDN緩存;
- 如果是cookie原因,可以刪除不必要的cookie,縮短cookie有效期;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章