瀏覽器快取策略分為兩種:
強快取協商快取
相同點
如果命中,都是從快取中載入資源
不同點
協商快取會向伺服器發起請求去驗證是否命中快取,而強快取不需要傳送請求
expires
是http/1.0
控制網頁快取的字段,其值是伺服器返回改請求結果快取的到期時間,是個絕對時間。
expires控制快取的原理,是使用客戶端的時間與伺服器端返回的時間做對比,如果客戶端與伺服器端的時間發生誤差(如時區不同,修改了客戶端時間),那麼強快取就會失效。
為了解決expires
的問題,在http/1.1
中提出了cache-control
用於控制網頁快取
主要取值
expires和cache-control:max-age=*** 的作用是差不多的,區別就在於expires
是http1.0
的產物,cache-control
是http1.1
的產物。
兩者同時存在的話,cache-control優先順序高於expires;
在某些不支援http1.1的環境下,expires就會發揮用處。所以expires其實是過時的產物,現階段它的存在只是一種相容性的寫法
瀏覽器快取存放位置
本地快取分為記憶體快取(from memory cache)和硬碟快取(from disk cache)
記憶體快取
記憶體快取具有兩個特點:
硬碟快取
硬碟快取是直接將快取寫入硬碟中,讀取快取需要對該快取存放的硬碟檔案進行i/o操作,然後重新解析該快取內容,讀取複雜,速度比記憶體快取(memory cache)慢
協商快取就是強制快取失效後,瀏覽器攜帶快取標識向伺服器發起請求,由伺服器根據快取標識決定是否使用快取。
控制協商快取的字段分別為:last-modified/if-modified-since
和etag/if-none-match
其中etag/if-none-match
的優先順序更高
last-modified / if-modified-since
last-modified
是伺服器響應請求時,返回該資源檔案在伺服器最後被修改的時間
if-modified-since
則是客戶端再次發起該請求時,攜帶上次返回的last-modified
值。
當伺服器收到該請求,並且發現請求頭有if-modified-since
欄位時,就會將該值與該資源在伺服器的最後修改時間做對比,如果有更新就重新返回資源,狀態碼為200;如果沒有更新,則返回304,繼續使用快取檔案
etag / if-none-match
etag
是伺服器響應請求時,返回當前資源檔案的乙個唯一標識(由伺服器生成)
if-none-match
是客戶端再次發起該請求時,攜帶上次請求返回的etag
值
當伺服器接收到請求,並且發現請求頭有if-none-match
時,就會將該值與資源在伺服器的etag
值做對比,一致則代表資源沒有更新,返回304,使用快取檔案;不一致則重新返回資源檔案,狀態碼為200
設定請求頭
給請求資源增加乙個版本號/隨機數
html中禁用快取
本地快取需要高時效性怎麼辦 快取架構之多級快取
我們之前在快取架構之redis中,主要講解的是redis是如何支援高併發的,它的內部原理的基本思路等。在乙個高併發的系統中,redis就是底層的快取儲存的支援,可以說是重中之重。但是不要以為,做個快取,就是用一下redis就夠了,簡單的快取系統,那麼做自然ok,但是在複雜的高併發情況的,遇到的問題非...
為什麼需要快取記憶體
title 為什麼需要快取記憶體 categories 深入理解計算機系統 我們知道,如果要執行乙個程式,首先得將乙個可執行檔案載入到記憶體當中。那麼問題來了,假如我程式中是要對乙個陣列進行操作,而我陣列的資料又是放在記憶體上的,那麼cpu對每乙個元素進行操作的時候,都要先把資料載入到暫存器上,對暫...
美國是否需要高鐵
現在哪個城市如果沒有通高鐵,都天天盼望著。為什麼呢?乙個字,速度快。因為速度快,體驗就非常好了。這個咱們不用多說。其實當初要搞高鐵,決策層是不願意的。為什麼呢?覺得沒有必要。後來搞了曲線策略,先修城際高鐵,再鼓吹其好處。於是開始大規模修建。中國高鐵這麼好,那麼外國是否需要?按照慣例,所謂外國,都是指...