国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

從前端角度理解緩存

Astrian / 1259人閱讀

摘要:緩存的概念分很多種,本次討論的主要就是前端緩存中的緩存。從字面理解,強(qiáng)制緩存的方式簡(jiǎn)單粗暴,給設(shè)置了過期時(shí)間,超過這個(gè)時(shí)間之后過期需要重新請(qǐng)求。這個(gè)方法簡(jiǎn)單直接,直接設(shè)定一個(gè)絕對(duì)的時(shí)間當(dāng)前時(shí)間緩存時(shí)間。然后從緩存中讀取數(shù)據(jù)。

緩存的概念分很多種,本次討論的主要就是前端緩存中的Http緩存。

緩存是怎么回事

前端發(fā)送請(qǐng)求主要經(jīng)歷以下三個(gè)過程,請(qǐng)求->處理->響應(yīng)。
如果有多次請(qǐng)求就需要重復(fù)執(zhí)行這個(gè)過程。

重復(fù)請(qǐng)求的過程

以下是一個(gè)重復(fù)請(qǐng)求的流程圖:

從以上的流程圖可以看書,如果用戶重復(fù)請(qǐng)求同一資源的話,會(huì)對(duì)服務(wù)器資源造成浪費(fèi),服務(wù)器重復(fù)讀取資源,發(fā)送給瀏覽器后瀏覽器重復(fù)下載,造成不必要的等待與消耗。

緩存讀取的過程

緩存讀取就是瀏覽器在向服務(wù)器請(qǐng)求資源之前,先查詢一下本地緩存中是否存在需要的資源,如果存在,那便優(yōu)先從緩存中讀取。當(dāng)緩存不存在或者過期,再向服務(wù)器發(fā)送請(qǐng)求。

如何開啟Http緩存并對(duì)緩存進(jìn)行設(shè)置,是本次討論的關(guān)鍵。

緩存的類型

瀏覽器有如下常見的幾個(gè)字段:

expires: 設(shè)置緩存過期的時(shí)間

private: 客戶端可以緩存

public: 客戶端和代理服務(wù)器都可緩存

max-age=xxx: 緩存的內(nèi)容將在 xxx 秒后失效

no-cache: 需要使用對(duì)比緩存來驗(yàn)證緩存數(shù)據(jù)

no-store: 所有內(nèi)容都不會(huì)緩存,強(qiáng)制緩存,對(duì)比緩存都不會(huì)觸發(fā)

last-modified: 內(nèi)容上次被修改的時(shí)間

Etag: 文件的特殊標(biāo)識(shí)

強(qiáng)制緩存和協(xié)商緩存

緩存方法可以分為強(qiáng)制緩存與協(xié)商緩存。

從字面理解,強(qiáng)制緩存的方式簡(jiǎn)單粗暴,給cache設(shè)置了過期時(shí)間,超過這個(gè)時(shí)間之后cache過期需要重新請(qǐng)求。上述字段中的expirescache-control中的max-age都屬于強(qiáng)制緩存。

協(xié)商緩存根據(jù)一系列條件來判斷是否可以使用緩存。

強(qiáng)制緩存優(yōu)先級(jí)高于協(xié)商緩存

強(qiáng)制緩存 expires

expires給瀏覽器設(shè)置了一個(gè)絕對(duì)時(shí)間,當(dāng)瀏覽器時(shí)間超過這個(gè)絕對(duì)時(shí)間之后,重新向服務(wù)器發(fā)送請(qǐng)求。

Expires: Fri, 04 Jan 2019 12:00:00 GMT

這個(gè)方法簡(jiǎn)單直接,直接設(shè)定一個(gè)絕對(duì)的時(shí)間 (當(dāng)前時(shí)間+緩存時(shí)間)。但是也存在隱患,例如瀏覽器當(dāng)前時(shí)間是可以進(jìn)行更改的,更改之后expires設(shè)置的絕對(duì)時(shí)間相對(duì)不準(zhǔn)確,cache可能會(huì)出現(xiàn)長(zhǎng)久不過期或者很快就過期的情況。

cache-control: max-age

為了解決expires存在的問題,Http1.1版本中提出了cache-control: max-age,該字段與expires的緩存思路相同,都是設(shè)置了一個(gè)過期時(shí)間,不同的是max-age設(shè)置的是相對(duì)緩存時(shí)間開始往后多久,因此不存在受日期不準(zhǔn)確情況的影響。

但是強(qiáng)制緩存存在一個(gè)問題,該緩存方式優(yōu)先級(jí)高,如果在過期時(shí)間內(nèi)緩存的資源在服務(wù)器上更新了,客服端不能及時(shí)獲取最新的資源。

協(xié)商緩存

協(xié)商緩存解決了無(wú)法及時(shí)獲取更新資源的問題。以下兩組字段,都可以對(duì)資源做標(biāo)識(shí),由服務(wù)器做分析,如果未進(jìn)行更新,那返回304狀態(tài)碼,從緩存中讀取資源,否則重新請(qǐng)求資源。

last-modify

last-modify告知了客戶端上次修改該資源的時(shí)間,

Last-Modified: Wed, 02 Jan 2019 03:06:03 GMT

瀏覽器將這個(gè)值記錄在if-modify-since中(瀏覽器自動(dòng)記錄了該字段信息),下一次請(qǐng)求相同資源時(shí),與服務(wù)器返回的last-modify進(jìn)行比對(duì),如果相等,則表示未修改,響應(yīng) 304;反之,則表示修改了,響應(yīng) 200 狀態(tài)碼,并返回?cái)?shù)據(jù)。

last-modify以秒為單位進(jìn)行更新,如果小于該單位高頻進(jìn)行更新的話,不適合采用該方法。

ETag

ETag是對(duì)資源的特殊標(biāo)識(shí)

Etag: W/"e563df87b65299122770e0a84ada084f"

請(qǐng)求該資源成功之后,將返回的ETag存入if-none-match字段中(瀏覽器自動(dòng)記錄了該字段信息),同樣在請(qǐng)求資源時(shí)傳遞給服務(wù)器,服務(wù)器查詢?cè)摼幋a對(duì)應(yīng)的資源有無(wú)更新,無(wú)更新返回304狀態(tài),更新返回200并重新請(qǐng)求。

以下有個(gè)小例子,查詢書籍更新:

當(dāng)書籍信息查詢之后,再次查詢,服務(wù)器根據(jù)資源的ETag查詢得知該資源沒有進(jìn)行更新,返回304狀態(tài)碼。

更新返回的數(shù)據(jù)信息,再次查詢,返回200狀態(tài)碼,重新進(jìn)行請(qǐng)求:

從返回的Request Headers可以看出,再次請(qǐng)求時(shí),瀏覽器自動(dòng)發(fā)送了If-Modified-SinceIf-None-Match兩個(gè)字段,瀏覽器根據(jù)這兩個(gè)字段中(If-None-Match 優(yōu)先級(jí)大于 If-Modified-Since)來判斷是否修改了資源。

ETag如何計(jì)算

ETag是針對(duì)某個(gè)文件的特殊標(biāo)識(shí),服務(wù)器默認(rèn)采用SHA256算法生成。也可以采用其他方式,保證編碼的唯一性即可。

緩存的優(yōu)先級(jí)

根據(jù)上文優(yōu)缺點(diǎn)的比對(duì),可以得出以下的優(yōu)先級(jí)順序:

Cache-Control > Expires > ETag > Last-Modified

如果資源需要用到強(qiáng)制緩存,Cache-Control相對(duì)更加安全,協(xié)商緩存中利用ETag查詢更新更加全面。

圖片來源:瀏覽器緩存機(jī)制詳解

緩存存儲(chǔ)在哪 disk cache

disk cache為存儲(chǔ)在硬盤中的緩存,存儲(chǔ)在硬盤中的資源相對(duì)穩(wěn)定,不會(huì)隨著tab或?yàn)g覽器的關(guān)閉而消失,可以用來存儲(chǔ)大型的,需長(zhǎng)久使用的資源。

當(dāng)硬盤中的資源被加載時(shí),內(nèi)存中也存儲(chǔ)了該資源,當(dāng)下次改資源被調(diào)用時(shí),會(huì)優(yōu)先從memory cache中讀取,加快資源的獲取。

memory cache

memory cache即存儲(chǔ)在內(nèi)存中的緩存,內(nèi)存中的內(nèi)容會(huì)隨著tab的關(guān)閉而釋放。

當(dāng)接口狀態(tài)返回304時(shí),資源默認(rèn)存儲(chǔ)在memory cache中,當(dāng)頁(yè)面關(guān)閉后,重新打開需要再次請(qǐng)求。

這兩種存儲(chǔ)方式的區(qū)別可以參考該回答

When you visit a URL in Chrome, the HTML and the other assets(like images) on the page are stored locally in a memory and a disk cache. Chrome will use the memory cache first because it is much faster, but it will also store the page in a disk cache in case you quit your browser or it crashes, because the disk cache is persistent.

當(dāng)您訪問chrome中的URL時(shí),頁(yè)面上的HTML和其他資產(chǎn)(如圖像)將本地存儲(chǔ)在內(nèi)存和磁盤緩存中。Chrome將首先使用內(nèi)存緩存,因?yàn)樗乃俣瓤斓枚啵矔?huì)將頁(yè)面存儲(chǔ)在磁盤緩存中,以防您退出瀏覽器或它崩潰,因?yàn)榇疟P緩存是持久的。

為什么有的資源一會(huì)from disk cache,一會(huì)from memory cache

三級(jí)緩存原理

先去內(nèi)存看,如果有,直接加載

如果內(nèi)存沒有,擇取硬盤獲取,如果有直接加載

如果硬盤也沒有,那么就進(jìn)行網(wǎng)絡(luò)請(qǐng)求

加載到的資源緩存到硬盤和內(nèi)存,下次請(qǐng)求可以快速?gòu)膬?nèi)存中獲取到

為什么有的請(qǐng)求狀態(tài)碼返回200,有的返回304 200 from memory cache

不訪問服務(wù)器,直接讀緩存,從內(nèi)存中讀取緩存。此時(shí)的數(shù)據(jù)時(shí)緩存到內(nèi)存中的,當(dāng)關(guān)閉進(jìn)程后,也就是瀏覽器關(guān)閉以后,數(shù)據(jù)將不存在。

但是這種方式只能緩存派生資源。

200 from disk cache

不訪問服務(wù)器,直接讀緩存,從磁盤中讀取緩存,當(dāng)關(guān)閉進(jìn)程時(shí),數(shù)據(jù)還是存在。

這種方式也只能緩存派生資源

304 Not Modified

訪問服務(wù)器,發(fā)現(xiàn)數(shù)據(jù)沒有
更新,服務(wù)器返回此狀態(tài)碼。然后從緩存中讀取數(shù)據(jù)。

薄荷應(yīng)用

舉一個(gè)簡(jiǎn)單的小

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/101150.html

相關(guān)文章

  • 瀏覽器的緩存機(jī)制

    摘要:從瀏覽器角度來看,整個(gè)就是一個(gè)源服務(wù)器,從這個(gè)層面來說,瀏覽器和服務(wù)器之間的緩存機(jī)制,在這種架構(gòu)下同樣適用。如果命中,則返回,告訴瀏覽器資源未更新,可使用本地的緩存。 緩存類型 緩存在宏觀上可以分成兩類:私有緩存和共享緩存。共享緩存就是那些能被各級(jí)代理緩存的緩存。私有緩存就是用戶專享的,各級(jí)代理不能緩存的緩存。 微觀上可以分下面幾類: 瀏覽器緩存 緩存存在的意義就是當(dāng)用戶點(diǎn)擊back按...

    LeanCloud 評(píng)論0 收藏0
  • 深入理解 Webpack 打包分塊(上)

    摘要:而一個(gè)哈希字符串就是根據(jù)文件內(nèi)容產(chǎn)生的簽名,每當(dāng)文件內(nèi)容發(fā)生更改時(shí),哈希串也就發(fā)生了更改,文件名也就隨之更改。很顯然這不是我們需要的,如果文件內(nèi)容發(fā)生了更改,的打包文件的哈希應(yīng)該發(fā)生變化,但是不應(yīng)該。前言 隨著前端代碼需要處理的業(yè)務(wù)越來越繁重,我們不得不面臨的一個(gè)問題是前端的代碼體積也變得越來越龐大。這造成無(wú)論是在調(diào)式還是在上線時(shí)都需要花長(zhǎng)時(shí)間等待編譯完成,并且用戶也不得不花額外的時(shí)間和帶寬...

    Rocko 評(píng)論0 收藏0
  • JavaScript系列(四) - 收藏集 - 掘金

    摘要:函數(shù)式編程前端掘金引言面向?qū)ο缶幊桃恢币詠矶际侵械闹鲗?dǎo)范式。函數(shù)式編程是一種強(qiáng)調(diào)減少對(duì)程序外部狀態(tài)產(chǎn)生改變的方式。 JavaScript 函數(shù)式編程 - 前端 - 掘金引言 面向?qū)ο缶幊桃恢币詠矶际荍avaScript中的主導(dǎo)范式。JavaScript作為一門多范式編程語(yǔ)言,然而,近幾年,函數(shù)式編程越來越多得受到開發(fā)者的青睞。函數(shù)式編程是一種強(qiáng)調(diào)減少對(duì)程序外部狀態(tài)產(chǎn)生改變的方式。因此,...

    cfanr 評(píng)論0 收藏0
  • 理解釋 - 收藏集 - 掘金

    摘要:巧前端基礎(chǔ)進(jìn)階全方位解讀前端掘金我們?cè)趯W(xué)習(xí)的過程中,由于對(duì)一些概念理解得不是很清楚,但是又想要通過一些方式把它記下來,于是就很容易草率的給這些概念定下一些方便自己記憶的有偏差的結(jié)論。 計(jì)算機(jī)程序的思維邏輯 (83) - 并發(fā)總結(jié) - 掘金從65節(jié)到82節(jié),我們用了18篇文章討論并發(fā),本節(jié)進(jìn)行簡(jiǎn)要總結(jié)。 多線程開發(fā)有兩個(gè)核心問題,一個(gè)是競(jìng)爭(zhēng),另一個(gè)是協(xié)作。競(jìng)爭(zhēng)會(huì)出現(xiàn)線程安全問題,所以,本...

    AlphaGooo 評(píng)論0 收藏0
  • 理解釋 - 收藏集 - 掘金

    摘要:巧前端基礎(chǔ)進(jìn)階全方位解讀前端掘金我們?cè)趯W(xué)習(xí)的過程中,由于對(duì)一些概念理解得不是很清楚,但是又想要通過一些方式把它記下來,于是就很容易草率的給這些概念定下一些方便自己記憶的有偏差的結(jié)論。 計(jì)算機(jī)程序的思維邏輯 (83) - 并發(fā)總結(jié) - 掘金從65節(jié)到82節(jié),我們用了18篇文章討論并發(fā),本節(jié)進(jìn)行簡(jiǎn)要總結(jié)。 多線程開發(fā)有兩個(gè)核心問題,一個(gè)是競(jìng)爭(zhēng),另一個(gè)是協(xié)作。競(jìng)爭(zhēng)會(huì)出現(xiàn)線程安全問題,所以,本...

    forrest23 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<