瀏覽器緩存(一):強緩存 MEMORY CACHE 和 DISK CACHE
關於memory cache 和 disk cache
隨便瀏覽一個網站:
首次打開,或者開啟瀏覽器的 Disable Cache(瀏覽器的Network下, 與Preserve log同級別),在size 一欄會顯示資源大小。
在關閉 Disable Cache 的情況下,然后再次刷新頁面,發現size 一欄 顯示(memory cache) 或者(disk cache)
圖片對應的是 memory cache
css等資源是 disk cache
查看對應的請求頭:
在General下面的 Status Code 會顯示 200OK (from memory cache) 或者(from disk cache)
所以了解下兩者的區別
disk cache(磁盤緩存) 和 memory cache(內存緩存)的區別?
都屬於強緩存,現在瀏覽器緩存存儲圖像和網頁等(主要在磁盤上),而你的操作系統緩存文件可能大部分在內存緩存中。使用這兩個緩存功能,是因為它比從遠程的 web 服務器獲取這些資源的方式更近、更快。Cpu 本身是有”緩存線”的,它是程序最近使用的內存(RAM)部分的副本。這樣,如果一個程序在一個循環中運行(一遍又一遍地做同樣的事情) ,它也就不必為每個指令或數據塊進入 RAM 了。這個緩存比 RAM 快得多,但是它非常小,因為超快的內存畢竟昂貴。
強緩存作為性能優化中緩存方面最有效的手段,能夠極大的提升性能。由於強緩存不會向服務端發送請求,對服務端的壓力也是大大減小。對於不太經常變更的資源,可以設置一個超長時間的緩存時間,比如一年。瀏覽器在首次加載后,都會從緩存中讀取。但是由於不會向服務端發送請求,那么如果資源有更改的時候,怎么讓瀏覽器知道呢?現在常用的解決方法是加一個?v=xxx的后綴,在更新靜態資源版本的時候,更新這個v的值,這樣相當於向服務端發起一個新的請求,從而達到更新靜態資源的目的。
至於區別主要在於提取速度上,memory cache 要比 disk cache 快的多,怎么使用要看前端技術人員結合自己網站來選擇了,兩個都是很不錯的緩存方式!舉個例子:從遠程 web 服務器直接提取訪問文件可能需要500毫秒(半秒),那么磁盤訪問可能需要10-20毫秒,而內存訪問只需要100納秒,更高級的還有 L1緩存訪問(最快和最小的 CPU 緩存)只需要0.5納秒。
- 200 form memory cache
不訪問服務器,一般已經加載過該資源且緩存在了內存當中,直接從內存中讀取緩存。瀏覽器關閉后,數據將不存在(資源被釋放掉了),再次打開相同的頁面時,不會出現from memory cache。 - 200 from disk cache
不訪問服務器,已經在之前的某個時間加載過該資源,直接從硬盤中讀取緩存,關閉瀏覽器后,數據依然存在,此資源不會隨着該頁面的關閉而釋放掉下次打開仍然會是from disk cache。 - 304 Not Modified
訪問服務器,發現數據沒有更新,服務器返回此狀態碼。然后從緩存中讀取數據。
狀態 | 類型 | 說明 |
---|---|---|
200 | form memory cache | 不訪問服務器,直接讀緩存,從內存中讀取緩存。此時的數據時緩存到內存中的,當kill進程后,也就是瀏覽器關閉以后,數據將不存在。但是這種方式只能緩存派生資源 |
200 | form disk cache | 不請求網絡資源(服務器),直接從磁盤中讀取緩存,當kill進程時,數據還是存在。 |
200 | 資源大小數值 | 從服務器下載最新資源 |
304 | 報文大小 | 請求服務端,返回304,發現資源沒更新,然后從緩存中讀取數據, 困惑點,服務器如何判斷from memory cache還是304 |
但實際上真是如此嗎?
再深入研究下

三級緩存原理
1. 先去內存看,如果有,直接加載
2. 如果內存沒有,擇取硬盤獲取,如果有直接加載
3. 如果硬盤也沒有,那么就進行網絡請求
4. 加載到的資源緩存到硬盤和內存
比如:訪問圖片-> 200 -> 退出瀏覽器
再進來-> 200(from disk cache) -> 刷新 -> 200(from memory cache)
http header
max-age
web中的文件被用戶訪問(請求)后的存活時間,是個相對的值,相對Request_time(請求時間)
Expires
Expires指定的時間根據服務器配置可能有兩種:
1. 文件最后訪問時間
2. 文件絕對修改時間
如果max-age和Expires同時存在,則被Cache-Control的max-age覆蓋
last-modified
WEB 服務器認為對象的最后修改時間,比如文件的最后修改時間,動態頁面的最后產生時間
ETag
對象(比如URL)的標志值,就一個對象而言,文件被修改,Etag也會修改
Cache-Control
簡單理解,強緩存
結論:所以實際應用中,遇到資源更新之后,還是有緩存的情況,除了刷新cdn,還要檢查下是否有設置http響應頭,做對應的緩存過期時間處里,如果沒有做緩存過期策略,如果客戶端緩存的資源,並且走了 disk cache,可能怎么刷新都沒辦法獲取最新的資源。
來自網絡的一張圖結尾:
