緩存從入門到放棄

什麼是緩存?

緩存的定義

緩存就是數據交換的緩衝區(稱做Cache),這個概念最初是來自於內存和CPU。當某一硬件要讀取數據時,會首先從緩存中查找須要的數據,若是找到了則直接執行,找不到的話則從內存中找。因爲緩存的運行速度比內存快得多,故緩存的做用就是幫助硬件更快地運行html

web緩存是什麼

請求的本質是從客戶端發送請求,從獲取服務器資源(圖片、文件、數據)。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)。 以下圖所示:負載均衡

協商緩存

>瀏覽器第一次請求數據時,服務器會將緩存標識與數據一塊兒返回給客戶端,客戶端將兩者備份至緩存數據庫中。 再次請求數據時,客戶端將備份的緩存標識發送給服務器,服務器根據緩存標識進行判斷,判斷成功後,返回304狀態碼,通知客戶端比較成功,可使用緩存數據。

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實現)

  1. 當用戶點擊網站頁面上的內容URL,通過本地DNS系統解析,DNS系統會最終將域名的解析權交給CNAME指向的CDN專用DNS服務器。
  2. CDN的DNS服務器將CDN的全局負載均衡設備IP地址返回用戶。用戶向CDN的全局負載均衡設備發起內容URL訪問請求。CDN全局負載均衡設備根據用戶IP地址,以及用戶請求的內容URL,選擇一臺用戶所屬區域的區域負載均衡設備(邊緣節點),告訴用戶向這臺設備發起請求。均衡設備把服務器的IP地址返回給用戶。
  3. 用戶向緩存服務器發起請求,緩存服務器響應用戶請求,將用戶所需內容傳送到用戶終端。若是這臺緩存服務器上並無用戶想要的內容,而區域均衡設備依然將它分配給了用戶,那麼這臺服務器就要向它的上一級緩存服務(多級緩存)器請求內容,直至追溯到網站的源服務器將內容拉到本地(回源)。

服務端緩存

  1. 頁面緩存,這種緩存技術通常用於不會常常變更信息,而且訪問次數較多的頁面,這樣就不用每次都動態加載。
  2. 模板緩存,有些語言程序運行時動態對程序進行編譯,爲了不每次請求都進行編譯,則會緩存編譯後的一個模板文件。
  3. 數據緩存,頁面數據來自DB時,每次DB操做是須要消耗時間和資源的。將高頻操做的數據放入到內存中,避免頻繁的操做數據庫。

黑科技

  1. Service workers 本質上充當Web應用程序與瀏覽器之間的代理服務器,也能夠在網絡可用時做爲瀏覽器和網絡間的代理。它們旨在(除其餘以外)使得可以建立有效的離線體驗,攔截網絡請求並基於網絡是否可用以及更新的資源是否駐留在服務器上來採起適當的動做。在目前階段,ServiceWorker的主要能力集中在網絡代理和離線緩存上。具體的實現上,能夠理解爲ServiceWorker是一個能在網頁關閉時仍然運行的WebWorker。

緩存的優點和問題

爲何使用緩存?

  • 提升響應速度,減小響應延遲
  • 減小資源消耗(服務器、帶寬)

使用緩存可能致使的問題?

  • 緩存雪崩,是指緩存使用不合理時,某一時間緩存失效,大量請求會直接到達向服務器,服務器沒法承載大量請求,就致使服務器崩潰
  • 緩存更新不及時,是指緩存使用不合理時,服務器文件更新,用戶獲取到的仍是舊的錯誤的緩存文件。

合理使用緩存

  1. 分離變化的部分,常常變化的業務邏輯和基礎工具庫抽離。
  2. 對基礎工具庫能夠設置長緩存Cache-Control: max-age=31536000
  3. 對常常變化的由於邏輯可使用短緩存時間+must-revalidate 或者使用協商緩存
  4. 使用文件戳控制緩存

參考文章:

三種緩存方式,不再用麻煩運維小哥哥了!!!
完全弄懂HTTP緩存機制及原理
設計一個無懈可擊的瀏覽器緩存方案:關於思路,細節,ServiceWorker,以及HTTP/2
CDN學習筆記一(CDN是什麼?)

相關文章
相關標籤/搜索