什麼是快取?
快取的定義
快取就是資料交換的緩衝區(稱作Cache),這個概念最初是來自於記憶體和CPU。當某一硬體要讀取資料時,會首先從快取中查詢需要的資料,如果找到了則直接執行,找不到的話則從記憶體中找。由於快取的執行速度比記憶體快得多,故快取的作用就是幫助硬體更快地執行
web快取是什麼
請求的本質是從客戶端傳送請求,從獲取伺服器資源(圖片、檔案、資料)。
web快取就是根據請求儲存響應內容,當發起下一個相同資源的請求時,直接使用上次儲存的內容來響應請求。
web快取的型別
強快取
瀏覽器第一次請求資料時,伺服器會將檔案的過期時間和檔案一起返回給客戶端,客戶端將二者備份至快取資料庫中。再次請求資料時,客戶端將根據檔案的過期時間去判斷,檔案是否過期。檔案未過期,則直接使用快取資料庫中檔案,檔案過期了,則重新從伺服器上獲取。
Expires
- Expires是http1.0提出的一個表示資源過期時間的header,它描述的是一個絕對時間,由伺服器返回。
- Expires第二次請求時,將和本地時間比對。
Expires 第一次請求伺服器是,響應頭會返回一個Expires的檔案過期時間。 如下圖所示:
Expires 第二次請求,客戶端使用本地時間和檔案的過期時間進行比對,如果檔案未過期則直接使用本地快取,返回狀態碼200(from memory cache)或200(from disk cache)。 如下圖所示:
Expires Cache-Control
- Cache-Control: no-cache 必須先與代理伺服器確認是否更改,然後在在決定使用快取還是請求,類似於協商快取(304)
- Cache-Control: no-store 才是真正的不快取資料到本地
- Cache-Control: public 可以被所有使用者快取(多使用者共享),包括終端和CDN等中間代理伺服器
- Cache-Control: private 只能被終端瀏覽器快取(而且是私有快取),不允許中繼快取伺服器進行快取
- Cache-Control: must-revalidate如果快取內容失效,請求必須傳送伺服器進行驗證
- Cache-Control: max-age=s 快取內容在s秒後失效,僅HTTP1.1可用
max-gae 第一次請求伺服器時,響應頭會返回一個 max-age,是檔案多少時間後過期。 如下圖所示:
max-gae 第二次請求,客戶端會校驗檔案是否過期,如果檔案未過期則直接使用本地快取,返回狀態碼200(from memory cache)或200(from disk cache)。 如下圖所示:
協商快取
Last-Modified/If-Modified-Since
通過檔案的最後修改時間判斷該不該讀取快取,服務端設定響應頭Last-Modified,客戶端把上次服務端響應頭中的Last-modified值通過if-modified-since 傳遞給服務端 , 服務端通過比較當前檔案的修改時間和上次修改時間(上次傳給客戶端的值),如果相等那麼說明檔案修改時間沒變也就是沒變化。
Last-Modified的一次請求時,伺服器返回的響應頭裡麵包含快取標識Last-Modified
Last-Modified的第二次請求時,請求頭包含If-Modified-Since,伺服器獲取到該快取標識後,用該標識和檔案進行比對。如果快取檔案未過期則返回304狀態碼,客戶端使用快取問題。如果快取過期則返回新檔案,狀態碼為200。
Etag / If-None-Match
通過檔案的內容來判斷該不該讀取快取,服務端通過把檔案內容讀取出來,通過md5進行base64加密得出hash值,把這個值設定響應頭Etag,客戶端下一次請求通過if-none-match帶過來,服務端再比對當前檔案內容加密得出的hash值和上次是否一樣,如果一樣說明檔案內容沒有發生改變,這種方式是最準確的方式,但是也是最耗效能。
Etag的一次請求時,伺服器返回的響應頭裡麵包含快取標識Etag
Etag的第二次請求時,請求頭包含If-None-Match,伺服器獲取到該快取標識後,用該標識和檔案進行比對。如果快取檔案未過期則返回304狀態碼,客戶端使用快取問題。如果快取過期則返回新檔案,狀態碼為200。
CDN代理伺服器快取
CDN的全稱是Content Delivery Network,即內容分發網路。CDN是構建在網路之上的內容分發網路,依靠部署在各地的邊緣伺服器,通過中心平臺的負載均衡、內容分發、排程等功能模組,使使用者就近獲取所需內容,降低網路擁塞,提高使用者訪問響應速度和命中率。(CDN網路是在使用者和伺服器之間增加Cache層,如何將使用者的請求引導到Cache上獲得源伺服器的資料,主要是通過接管DNS實現)
- 當使用者點選網站頁面上的內容URL,經過本地DNS系統解析,DNS系統會最終將域名的解析權交給CNAME指向的CDN專用DNS伺服器。
- CDN的DNS伺服器將CDN的全域性負載均衡裝置IP地址返回使用者。使用者向CDN的全域性負載均衡裝置發起內容URL訪問請求。CDN全域性負載均衡裝置根據使用者IP地址,以及使用者請求的內容URL,選擇一臺使用者所屬區域的區域負載均衡裝置(邊緣節點),告訴使用者向這臺裝置發起請求。均衡裝置把伺服器的IP地址返回給使用者。
- 使用者向快取伺服器發起請求,快取伺服器響應使用者請求,將使用者所需內容傳送到使用者終端。如果這臺快取伺服器上並沒有使用者想要的內容,而區域均衡裝置依然將它分配給了使用者,那麼這臺伺服器就要向它的上一級快取服務(多級快取)器請求內容,直至追溯到網站的源伺服器將內容拉到本地(回源)。
服務端快取
- 頁面快取,這種快取技術一般用於不會經常變動資訊,並且訪問次數較多的頁面,這樣就不用每次都動態載入。
- 模板快取,有些語言程式執行時動態對程式進行編譯,為了避免每次請求都進行編譯,則會快取編譯後的一個模板檔案。
- 資料快取,頁面資料來自DB時,每次DB操作是需要消耗時間和資源的。將高頻操作的資料放入到記憶體中,避免頻繁的運算元據庫。
黑科技
- Service workers 本質上充當Web應用程式與瀏覽器之間的代理伺服器,也可以在網路可用時作為瀏覽器和網路間的代理。它們旨在(除其他之外)使得能夠建立有效的離線體驗,攔截網路請求並基於網路是否可用以及更新的資源是否駐留在伺服器上來採取適當的動作。在目前階段,ServiceWorker的主要能力集中在網路代理和離線快取上。具體的實現上,可以理解為ServiceWorker是一個能在網頁關閉時仍然執行的WebWorker。
快取的優勢和問題
為什麼使用快取?
- 提高響應速度,減少響應延遲
- 減少資源消耗(伺服器、頻寬)
使用快取可能導致的問題?
- 快取雪崩,是指快取使用不合理時,某一時間快取失效,大量請求會直接到達向伺服器,伺服器無法承載大量請求,就導致伺服器崩潰
- 快取更新不及時,是指快取使用不合理時,伺服器檔案更新,使用者獲取到的還是舊的錯誤的快取檔案。
合理使用快取
- 分離變化的部分,經常變化的業務邏輯和基礎工具庫抽離。
- 對基礎工具庫可以設定長快取Cache-Control: max-age=31536000
- 對經常變化的因為邏輯可以使用短快取時間+must-revalidate 或者使用協商快取
- 使用檔案戳控制快取
參考文章:
三種快取方式,再也不用麻煩運維小哥哥了!!!
徹底弄懂HTTP快取機制及原理
設計一個無懈可擊的瀏覽器快取方案:關於思路,細節,ServiceWorker,以及HTTP/2
CDN學習筆記一(CDN是什麼?)