最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

強制緩存和協(xié)商緩存的區(qū)別

2022-10-12 10:18 作者:doubleyong  | 我要投稿

01?

什么是瀏覽器緩存


瀏覽器緩存(Brower Caching)是瀏覽器在本地磁盤對用戶最近請求過的文檔進行存儲,當(dāng)訪問者再次訪問同一頁面時,瀏覽器就可以直接從本地磁盤加載文檔


瀏覽器緩存的優(yōu)點有:

1. 減少了冗余的數(shù)據(jù)傳輸,節(jié)省了網(wǎng)費2. 減少了服務(wù)器的負擔(dān),大大提升了網(wǎng)站的性能3. 加快了客戶端加載網(wǎng)頁的速度


通過復(fù)用以前獲取的資源,可以顯著提高網(wǎng)站和應(yīng)用程序的性能。Web 緩存減少了等待時間和網(wǎng)絡(luò)流量,因此減少了顯示資源表示形式所需的時間。通過使用 HTTP緩存,變得更加響應(yīng)性。



瀏覽器第一次請求時:


圖片




瀏覽器后續(xù)在進行請求時:

圖片




瀏覽器緩存分為強緩存(本地緩存)協(xié)商緩存(對比緩存)



02?

術(shù)語解釋


1. 緩存命中:指在緩存中找到請求的數(shù)據(jù).


2.?從服務(wù)端傳給客戶端的(響應(yīng)頭

? ? ? 1)?cache-control:?緩存相關(guān)的設(shè)置

? ? ? ?2)?expires:緩存的過期時間,用來指定資源到期的時間,是服務(wù)器端的具體時間點。也就是說Expires=max-age+請求時間,需要和last-modified結(jié)合使用。但是上面提到,cache-control的優(yōu)先級更高。

  3)Last-Modified:表示服務(wù)端資源最后修改的時間,也就是傳給客戶端,用于告訴客戶端,服務(wù)端資源最后修改的時間

  4)Etag:表示字符串唯一標(biāo)識符,也是傳給客戶端,用于告訴客戶端,表示服務(wù)端資源發(fā)生修改了的最新標(biāo)識。因為Last-Modified的一些缺陷,比如只能標(biāo)識到時間秒等,所以出現(xiàn)了Etag。當(dāng)然也可以自定義tag。

如圖:

圖片


2.從客戶端傳回服務(wù)端的(即請求頭):

  1)If-Modified-Since:表示詢問服務(wù)端,從某個時間點起資源是否修改了。這個時間點一般是服務(wù)端Last-Modified返回的時間點。

  2)If-None-Match:表示詢問服務(wù)端,某個tag字符串值是否不匹配,這個tag值一般是服務(wù)端Etag返回的最新的字符串標(biāo)識符。

如圖:

圖片


總結(jié):

客戶端請求服務(wù)端時,服務(wù)端在響應(yīng)頭添加 {Last-Modified:最新的時間1,Etag:最新的字符串標(biāo)識符1},客戶端保存服務(wù)端的Last-Modified的值和Etag的值,下次請求服務(wù)器時,在請求頭添加{If-Modified-Since:最新的時間1,Etag:最新的字符串標(biāo)識符1}。



03

?強制緩存?


強緩存:瀏覽器在請求某一資源時,會先獲取該資源緩存的header信息,判斷是否命中強緩存(cache-control和expires信息),若命中直接從緩存中獲取資源信息,包括緩存header信息;本次請求根本就不會與服務(wù)器進行通信;在chrome控制臺的network選項中可以看到該請求返回200的狀態(tài)碼;

圖片


為什么有內(nèi)存緩存和硬盤緩存呢,怎么區(qū)分?這涉及到內(nèi)存交換的知識了

我們都知道,雖然在運行速度上硬盤不如內(nèi)存,但在容量上內(nèi)存是無法與硬盤相提并論的。當(dāng)運行一個程序需要大量數(shù)據(jù)、占用大量內(nèi)存時,內(nèi)存就會被“塞滿”,并將那些暫時不用的數(shù)據(jù)放到硬盤中,而這些數(shù)據(jù)所占的空間就是虛擬內(nèi)存。現(xiàn)在我們也明白為什么pagefile.sys的大小會經(jīng)常變化了。
內(nèi)存在計算機中的作用很大,電腦中所有運行的程序都需要經(jīng)過內(nèi)存來執(zhí)行,如果執(zhí)行的程序分配的內(nèi)存的總量超過了內(nèi)存大小,就會導(dǎo)致內(nèi)存消耗殆盡。為了解決這個問題,Windows中運用了虛擬內(nèi)存技術(shù),即拿出一部分硬盤空間來充當(dāng)內(nèi)存使用,當(dāng)內(nèi)存占用完時,電腦就會自動調(diào)用硬盤來充當(dāng)內(nèi)存,以緩解內(nèi)存的緊張。
舉個例子來說,壓縮程序在壓縮時有時候需要讀取文件的很大一部分并保存在內(nèi)存中作反復(fù)的搜索。假設(shè)內(nèi)存大小是128MB,而要壓縮的文件有 200MB,且壓縮軟件需要保存在內(nèi)存中的大小也是 200MB,那么這時操作系統(tǒng)就要權(quán)衡壓縮程序和系統(tǒng)中的其他程序,把多出來的那一部分數(shù)據(jù)放進交換文件。

也就是說在超過VM設(shè)置的內(nèi)存大小后將進行內(nèi)存交換,跟硬盤內(nèi)存交換。

強緩存參數(shù)?

  1. Pragma,HTTP/1.0標(biāo)準(zhǔn)中定義的一個header屬性,請求中包含Pragma的效果跟在頭信息中定義Cache-Control: no-cache相同,但是HTTP的響應(yīng)頭沒有明確定義這個屬性,所以它不能拿來完全替代HTTP/1.1中定義的Cache-control頭。通常定義Pragma以向后兼容基于HTTP/1.0的客戶端。
    ?

  2. expires,這是http1.0時的規(guī)范;它的值為一個絕對時間的GMT格式的時間字符串,如Mon, 10 Jun 2015 21:31:12 GMT,如果發(fā)送請求的時間在expires之前,那么本地緩存始終有效,否則就會發(fā)送請求到服務(wù)器來獲取資源
    ?

  3. cache-control:max-age=number,這是http1.1時出現(xiàn)的header信息,主要是利用該字段的max-age值來進行判斷,它是一個相對值;資源第一次的請求時間和Cache-Control設(shè)定的有效期,計算出一個資源過期時間,再拿這個過期時間跟當(dāng)前的請求時間比較,如果請求時間在過期時間之前,就能命中緩存,否則就不行;cache-control除了該字段外,還有下面幾個比較常用的設(shè)置值:
    ?

    • no-cache:不使用本地緩存。需要使用緩存協(xié)商,先與服務(wù)器確認返回的響應(yīng)是否被更改,如果之前的響應(yīng)中存在ETag,那么請求的時候會與服務(wù)端驗證,如果資源未被更改,則可以避免重新下載。
      ?

    • no-store:直接禁止游覽器緩存數(shù)據(jù),每次用戶請求該資源,都會向服務(wù)器發(fā)送一個請求,每次都會下載完整的資源。
      ?

    • public:可以被所有的用戶緩存,包括終端用戶和CDN等中間代理服務(wù)器。
      ?

    • private:只能被終端用戶的瀏覽器緩存,不允許CDN等中繼緩存服務(wù)器對其緩存。

    • must-revalidate,指令,那就意味著緩存在考慮使用一個陳舊的資源時,必須先驗證它的狀態(tài),已過期的緩存將不被使用。

      Cache-Control: must-revalidate

  注意:如果cache-control與expires同時存在的話,cache-control的優(yōu)先級高于expires



04

?協(xié)商緩存


如果沒有命中強緩存,瀏覽器會發(fā)送請求到服務(wù)器,請求會攜帶第一次請求返回的有關(guān)緩存的header字段信息(Last-Modified/If-Modified-Since和Etag/If-None-Match),由服務(wù)器根據(jù)請求中的相關(guān)header信息來比對結(jié)果是否協(xié)商緩存命中;若命中,則服務(wù)器返回新的響應(yīng)header信息(返回304狀態(tài)碼)更新緩存中的對應(yīng)header信息,但是并不返回資源內(nèi)容,它會告知瀏覽器可以直接從緩存獲??;否則返回最新的資源內(nèi)容,


協(xié)商緩存參數(shù)?

協(xié)商緩存都是由服務(wù)器來確定緩存資源是否可用的,所以客戶端與服務(wù)器端要通過某種標(biāo)識來進行通信,從而讓服務(wù)器判斷請求資源是否可以緩存訪問,這主要涉及到下面兩組header字段,這兩組搭檔都是成對出現(xiàn)的,即第一次請求的響應(yīng)頭帶上某個字段(Last-Modified或者Etag),則后續(xù)請求則會帶上對應(yīng)的請求字段(If-Modified-Since或者If-None-Match),若響應(yīng)頭沒有Last-Modified或者Etag字段,則請求頭也不會有對應(yīng)的字段。

  1. Last-Modified/If-Modified-Since
    二者的值都是GMT格式的時間字符串,具體過程:

    • 瀏覽器第一次跟服務(wù)器請求一個資源,服務(wù)器在返回這個資源的同時,在respone的header加上Last-Modified的header,這個header表示這個資源在服務(wù)器上的最后修改時間
      ?

    • 瀏覽器再次跟服務(wù)器請求這個資源時,在request的header上加上If-Modified-Since的header,這個header的值就是上一次請求時返回的Last-Modified的值
      ?

    • 服務(wù)器再次收到資源請求時,根據(jù)瀏覽器傳過來If-Modified-Since和資源在服務(wù)器上的最后修改時間判斷資源是否有變化,如果沒有變化則返回304 Not Modified,但是不會返回資源內(nèi)容;如果有變化,就正常返回資源內(nèi)容。當(dāng)服務(wù)器返回304 Not Modified的響應(yīng)時,response header中不會再添加Last-Modified的header,因為既然資源沒有變化,那么Last-Modified也就不會改變,這是服務(wù)器返回304時的response header
      ?

    • 瀏覽器收到304的響應(yīng)后,就會從緩存中加載資源
      ?

    • 如果協(xié)商緩存沒有命中,瀏覽器直接從服務(wù)器加載資源時,Last-Modified的Header在重新加載的時候會被更新,下次請求時,If-Modified-Since會啟用上次返回的Last-Modified值
      ?

  2. Etag/If-None-Match
    這兩個值是由服務(wù)器生成的每個資源的唯一標(biāo)識字符串,只要資源有變化就這個值就會改變;其判斷過程與Last-Modified/If-Modified-Since類似,與Last-Modified不一樣的是,當(dāng)服務(wù)器返回304 Not Modified的響應(yīng)時,由于ETag重新生成過,response header中還會把這個ETag返回,即使這個ETag跟之前的沒有變化。



05

?強制緩存和協(xié)商緩存的區(qū)別


圖片




06

前端如何實現(xiàn)HTTP緩存


靜態(tài)的html頁面想要設(shè)置使用緩存需要通過HTTP的META設(shè)置expires和cache-control

設(shè)置如下網(wǎng)頁元信息:


語法:


圖片


以下場景均不能做瀏覽器緩存:
1. HTTP信息頭中包含Cache-Control:no-cache,pragma:no-cache,或Cache-Control:max-age=0等告訴瀏覽器不用緩存的請求


2. 需要根據(jù)Cookie,認證信息等決定輸入內(nèi)容的動態(tài)請求是不能被緩存的


3. 經(jīng)過HTTPS安全加密的請求,也存在例外情況


4. POST請求無法被緩存


5. HTTP響應(yīng)頭中不包含Last-Modified/Etag,也不包含Cache-Control/Expires的請求無法被緩存




茍有恒?,?何必三更眠五更起

關(guān)注我,一起學(xué)習(xí)吧



圖片


強制緩存和協(xié)商緩存的區(qū)別的評論 (共 條)

分享到微博請遵守國家法律
高台县| 秀山| 安顺市| 曲周县| 林甸县| 蓝田县| 类乌齐县| 永州市| 张掖市| 宜兰市| 汶川县| 广灵县| 濮阳县| 丹阳市| 司法| 宜丰县| 迁西县| 塔城市| 垦利县| 千阳县| 阿坝县| 深水埗区| 太仓市| 雅江县| 平湖市| 佛山市| 天水市| 奇台县| 鹤岗市| 商河县| 通海县| 大邑县| 南陵县| 濮阳市| 连山| 湘西| 克东县| 永安市| 阳山县| 嘉峪关市| 阿拉善盟|