強緩存 MEMORY CACHE 和 DISK CACHE


瀏覽器緩存(一):強緩存 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

 

看到網上有人說樣式表會緩存在磁盤中,不會緩存到內存中,css樣式加載一次即可渲染出頁面。js腳本可能會隨時執行,如果把腳本存在磁盤中,在執行時會把該腳本從磁盤中提取到緩存中來,這樣的IO開銷比較大,有可能會導致瀏覽器失去響應。
 
但實際上真是如此嗎?
 

再深入研究下

實際上,有些腳本依然 是from disk cache,為什么呢?誰決定這個資源「from disk cache」與「from memory cache」?
當然,最終決定使用哪種緩存的應該是客戶端,也就是瀏覽器了。瀏覽器對於緩存什么策略或者機制?
 
 

三級緩存原理

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,可能怎么刷新都沒辦法獲取最新的資源。

來自網絡的一張圖結尾:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM