一、緩存概念
緩存 是為了調節(jié)速度不一致的兩個或多個不同物質的速度,在中間對速度較快的一方起到一個加速訪問速度較慢的一方的作用。
比如 CPU 的一級、二級緩存 是保存了 CPU 最近經常訪問的數據;內存 是保存 CPU 經常訪問硬盤的數據;而且硬盤也有大小不一的緩存,甚至是物理服務器的 raid 卡有也緩存,都是為了起到加速 CPU 訪問硬盤數據的目的。
因為 CPU 的速度太快了, CPU 需要的數據硬盤往往不能在短時間內滿足 CPU 的需求,因此 CPU 緩存、內存、 Raid 卡以及硬盤緩存就在一定程度上滿足了 CPU 的數據需求,即 CPU 從緩存讀取數據可以大幅提高 CPU 的工作效率。

1.1 系統緩存
1.1.1 buffer 與 cache:
buffer:緩沖也叫 ,一般用于寫操作,可以將數據先寫入內存再寫入磁盤。buffer 一般用于寫緩沖,用于解決不同介質的速度不一致的緩沖,先將數據臨時寫入到離自己最近的地方,以提高寫入速度。例如 CPU 會把數據先寫到內存的磁盤緩沖區(qū),然后就認為數據已經寫入完成,然后由內核在后續(xù)的時間在寫入磁盤,所以服務器突然斷電會丟失內存中的部分數據。
cache:緩存也叫 ,一般用于讀操作。例如 CPU 讀文件從內存讀,如果內存沒有就先從硬盤讀到內存再讀到 CPU,將需要頻繁讀取的數據放在里自己最近的緩存區(qū)域,下次讀取的時候即可快速讀取。
1.1.2 cache 的保存位置:
- 客戶端:瀏覽器
- 內存:本地服務器、遠程服務器
- 硬盤:本機硬盤、遠程服務器硬盤
1.1.3 cache 的特性:
自動過期:給緩存的數據加上有效時間,超出時間后自動過期刪除
過期時間:強制過期,源網站更新圖片后 CDN 是不會更新的,需要強制是圖片緩存過期
命中率:即緩存的讀取命中率
1.2 用戶層緩存
1.2.1 DNS 緩存
默認為 ,即 60 秒之內在訪問同一個域名就不再進行 DNS 解析
查看 chrome 瀏覽器的 DNS 緩存:chrome://net-internals/#dns

1.2.2 火狐瀏覽器緩存

1.2.3 瀏覽器緩存過期機制
1.2.3.1 最后修改時間
系統調用會獲取文件的最后修改時間,如果沒有發(fā)生變化就返回給瀏覽器 的狀態(tài)碼,表示沒有發(fā)生變化,然后瀏覽器就使用的本地的緩存展示資源。


1.2.3.2 Etag 標記
基于 Etag 標記<u>是否一致</u>做判斷<u>頁面是否發(fā)生過變化</u>,比如基于 Nginx 的 etag on 來實現:

1.2.3.3 過期時間
,即不管資源是否過期都要發(fā)送請求進行協商,這樣會消耗不必要的時間,因此有了
,即第一次請求資源的時候帶一個資源的過期時間,默認為 30 天。當前這種方式使用的比較多,但是
,因此會加入一個
,使用用戶本地的時間計算緩存數據是否超過多少天,下面的過期時間為 2027 年,但是緩存的最大生存周期計算為天等于 3650 天即 10 年,過期時間如下:

瀏覽器的緩存過期機制講得更清楚: https://juejin.im/entry/5ad86c16f265da505a77dca4
1.3 CDN 緩存
1.3.1 什么是 CDN
內容分發(fā)網絡( Content Delivery Network),通過將服務內容分發(fā)至全網加速節(jié)點,利用全球調度系統使用戶能夠就近獲取,有效降低訪問延遲,提升服務可用性。
CDN 的好處在于:
- 第一降低機房的使用帶寬,因為很多資源通過 CDN 就直接返回用戶了。
- 第二解決不同運營商之間的互聯,因為可以讓聯通的網絡訪問聯通讓電信的網絡訪問電信,起到加速用戶訪問的目的。
- 第三:解決用戶訪問的地域問題,就近返回用戶資源。
百度 CDN: https://cloud.baidu.com/product/cdn.html
阿里 CDN: https://www.aliyun.com/product/cdn?spm=5176.8269123.416540.50.728y8n
騰訊 CDN: https://www.qcloud.com/product/cdn
1.3.2 用戶請求 CDN 流程
提前對靜態(tài)內容進行預緩存,避免大量的請求回源,導致主站網絡帶寬被打滿而導致數據無法更新,另外 CDN 可以將數據根據訪問的熱度不同而進行不同級別的緩存,例如訪問量最高的資源訪問 CDN 邊緣節(jié)點的內存,其次的放在 SSD 或者 SATA,再其次的放在云存儲,這樣兼顧了速度與成本。

1.3.3: CDN 主要優(yōu)勢:
提前對靜態(tài)內容進行預緩存,避免大量的請求回源,導致主站網絡帶寬被打滿而導致數據無法更新,另外 CDN 可以將數據根據訪問的熱度不同而進行不同級別的緩存,例如訪問量最高的資源訪問 CD邊緣節(jié)點的內存,其次的放在 SSD 或者 SATA,再其次的放在云存儲,這樣兼顧了速度與成本。緩存到最快的地方如內存,緩存的數據準確命中率高,訪問速度就快。
調度準確-將用戶調度到最近的邊緣節(jié)點
性能優(yōu)化-CDN 專門用于緩存響應速度快
安全相關-抵御攻擊
節(jié)省帶寬:由于用戶請求由邊緣節(jié)點響應,因此大幅降低到源站帶寬
1.4 應用層緩存
Nginx、 PHP 等 web 服務可以設置應用緩存以加速響應用戶請求, 另外有些解釋性語言比如 PHP/Python 不能直接運行,需要先編譯成字節(jié)碼,但字節(jié)碼需要解釋器解釋為機器碼之后才能執(zhí)行,因此字節(jié)碼也是一種緩存,有時候會出現程序代碼上線后字節(jié)碼沒有更新的現象。
1.5 其他層面緩存
CPU 緩存(L1 的數據緩存和 L1 的指令緩存)、二級緩存、三級緩存

磁盤緩存
RAID 卡
分布式緩存: redis、memcache