HTTP快取策略

2021-07-16 20:26:05 字數 2845 閱讀 9023

瀏覽器一般快取、css、js等靜態檔案,因為這些檔案的更新頻率相對來說比較低,合理利用瀏覽器的快取對**的效能提公升有很大幫助。http快取分為兩部分,分別是本地快取和快取協商,當本地快取不生效時會啟用快取協商。http快取主要由http協議的頭(header)資訊來制定。

本地快取是指當瀏覽器請求資源時,如果命中了瀏覽器本地的快取資源,那麼瀏覽器就不會傳送真正請求給伺服器。它的執行過程是:

第一次瀏覽器傳送請求給伺服器時,此時瀏覽器還沒有本地快取副本,伺服器返回資源給瀏覽器,響應碼是200 ok,瀏覽器收到資源後,把資源和對應的響應頭一起快取下來。

第二次瀏覽器準備傳送請求給伺服器時候,瀏覽器會先檢查上一次服務端返回的響應頭資訊中的cache-control和expires。cache-control的值是乙個相對值,單位為秒,表示資源在客戶端快取的最大有效期,過期時間為第一次請求的時間加上cache-control的值,過期時間跟當前的請求時間比較,判斷本地快取是否過期。expires的值是乙個日期格式字串,直接與當前客戶端請求時間比較判斷有沒有過期。如果cache-control和expires同時存在,cache-control優先順序高於expires。判斷結果如果本地快取資源沒過期,那麼命中快取,不再請求伺服器。

如果沒有命中,瀏覽器就會把請求傳送給伺服器,進入快取協商階段。

cache-control是http快取策略中最重要的頭資訊,格式為

"cache-control" ":" cache-directive
作為請求首部時,cache-directive 的可選值有:

作為響應首部時,cache-directive 的可選值有:

需要注意的是若請求頭中cache-control的值為max-age=seconds,則向(**)伺服器請求乙個存在時間(age)不超過seconds的快取,若max-age=0,則**伺服器不存在滿足條件的快取,因此一定是向原伺服器請求進行快取協商,這個時候的效果和no-cache是一樣的。

expires是http/1.0出現的頭資訊,同樣是用於決定本地快取策略的頭,它是乙個絕對時間,時間格式是如mon, 10 jun 2015 21:31:12 gmt,只要傳送請求時間是在expires之前,那麼本地快取始終有效,否則就會去伺服器傳送請求獲取新的資源。

如果同時出現cache-control:max-age和expires,那麼max-age優先順序更高。他們可以這樣組合使用:

cache-control:public

expires: mon, 10 jun 2015 21:31:12 gmt

瀏覽器第一次請求資源時,伺服器會把資源的最新修改時間last-modified:thu, 29 dec 2011 18:23:55 gmt放在響應頭中返回給瀏覽器,第二次請求時,瀏覽器就會把上一次伺服器返回的修改時間放在請求頭if-modified-since:thu, 29 dec 2011 18:23:55傳送給伺服器,伺服器就會拿這個時間跟伺服器上的資源的最新修改時間進行對比,如果兩者相等或者大於伺服器上的最新修改時間,那麼表示瀏覽器的快取是有效的,此時快取會命中,伺服器就不再返回內容給瀏覽器了,同時last-modified頭也不會返回,因為資源沒被修改,返回了也沒什麼意義。如果沒命中快取則最新修改的資源連同last-modified頭一起返回。

第一次請求返回的響應頭:

cache-control:max-age=3600

expires:tue, 26 jan 2016 08:28:52 gmt

last-modified:fri, 15 jan 2016 12:06:06 gmt

第二次請求的請求頭資訊:

if-modified-since:fri, 15 jan 2016 12:06:06 gmt
這組頭資訊是基於資源的修改時間來判斷資源有沒有更新,另一種方式就是根據資源的內容來判斷,就是接下來要討論的etag與if-none-match

etag/if-none-match與last-modified/if-modified-since的流程其實是類似的,唯一的區別是它基於資源的內容的摘要資訊(比如md5 hash)來判斷。瀏覽器傳送第二次請求時,會把第一次的響應頭資訊etag的值放在if-none-match的請求頭中傳送到伺服器,與最新的資源的摘要資訊對比,如果相等,取瀏覽器快取,否則內容有更新,最新的資源連同最新的摘要資訊返回。用etag的好處是如果因為某種原因到時資源的修改時間沒改變,那麼用etag就能區分資源是不是有被更新。

第一次請求返回的響應頭:

cache-control:public, max-age=31536000

etag: "15f0fff99ed5aae4edffdd6496d7131f"

第二次請求的請求頭資訊:

if-none-match: "15f0fff99ed5aae4edffdd6496d7131f"
就快取而言,get請求必然會快取(包括響應頭資訊和響應體資料),並且每次請求都會先嘗試從本地讀快取。對於post請求,並不是不能快取,只要http響應頭快取相關欄位給足了快取的條件,post請求結果也是會快取的。但是在發post請求的時候,是不會嘗試先從本地快取讀取資料的,必然會向伺服器傳送請求,但是快取協商還是存在的,也就是說可能會返回304。

HTTP 快取策略

瀏覽器一般快取 css js等靜態檔案,因為這些檔案的更新頻率相對來說比較低,合理利用瀏覽器的快取對 的效能提公升有很大幫助。http快取分為兩部分,分別是本地快取和快取協商,當本地快取不生效時會啟用快取協商。http快取主要由http協議的頭 header 資訊來制定。本地快取 本地快取是指瀏覽器...

HTTP 快取策略

前端開發的同學大家都知道,專案中的靜態檔案等資訊,都要做快取處理,這裡,我們就來說一下http的快取策略。快取,顧名思義,其實就把是拿到的資源存起來,下次要用的時候就可以直接使用啦。有什麼作用呢?重用已獲取的資源能夠有效的提公升 與應用的效能。快取其實是乙個很廣義的概念,用到的地方很多,當然作用只有...

http快取策略

http快取主要由兩種 本地快取和快取協商。優先使用本地快取,本地快取不起作用時使用快取協商。http快取主要是頭部資訊header來決定的。一 什麼是本地快取?本地快取有頭部資訊的cache control和expires來決定。cache control是個相對值常量,它有如下幾個值 no ca...