自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

寫給后端程序員的HTTP緩存原理介紹

開發(fā) 前端
通過Internet獲取資源既緩慢,成本又高。為此,Http協(xié)議里包含了控制緩存的部分,以使Http客戶端可以緩存和重用以前獲取的資源,從而優(yōu)化性能,提升體驗(yàn)。雖然Http中關(guān)于緩存控制的部分,隨著協(xié)議演進(jìn),有一些變化。但我覺著,作為后端程序員, 在開發(fā)Web服務(wù)時(shí),只需要關(guān)注請(qǐng)求頭If-None-Match、響應(yīng)頭ETag、響應(yīng)頭Cache-Control就足夠了。

通過Internet獲取資源既緩慢,成本又高。為此,Http協(xié)議里包含了控制緩存的部分,以使Http客戶端可以緩存和重用以前獲取的資源,從而優(yōu)化性能,提升體驗(yàn)。雖然Http中關(guān)于緩存控制的部分,隨著協(xié)議演進(jìn),有一些變化。但我覺著,作為后端程序員, 在開發(fā)Web服務(wù)時(shí),只需要關(guān)注請(qǐng)求頭If-None-Match、響應(yīng)頭ETag、響應(yīng)頭Cache-Control就足夠了。因?yàn)檫@三個(gè)Http頭就 可以滿足你的需求,并且,當(dāng)今絕大多數(shù)的瀏覽器,都支持這三個(gè)Http頭。我們所要做的就是,確保每個(gè)服務(wù)器響應(yīng)都提供正確的 HTTP 頭指令,以指導(dǎo)瀏覽器何時(shí)可以緩存響應(yīng)以及可以緩存多久。

緩存在哪兒?

HttpCache

上圖中有三個(gè)角色,瀏覽器、Web代理和服務(wù)器,如圖所示Http緩存存在于瀏覽器和Web代理中。當(dāng)然在服務(wù)器內(nèi)部,也存在著各種緩存,但這已經(jīng) 不是本文要討論的Http緩存了。所謂的Http緩存控制,就是一種約定,通過設(shè)置不同的響應(yīng)頭Cache-Control來控制瀏覽器和Web代理對(duì)緩 存的使用策略,通過設(shè)置請(qǐng)求頭If-None-Match和響應(yīng)頭ETag,來對(duì)緩存的有效性進(jìn)行驗(yàn)證。

響應(yīng)頭ETag

ETag全稱Entity Tag,用來標(biāo)識(shí)一個(gè)資源。在具體的實(shí)現(xiàn)中,ETag可以是資源的hash值,也可以是一個(gè)內(nèi)部維護(hù)的版本號(hào)。但不管怎樣,ETag應(yīng)該能反映出資源內(nèi)容的變化,這是Http緩存可以正常工作的基礎(chǔ)。

HttpCacheEtag

如上例中所展示的,服務(wù)器在返回響應(yīng)時(shí),通常會(huì)在Http頭中包含一些關(guān)于響應(yīng)的元數(shù)據(jù)信息,其中,ETag就是其中一個(gè),本例中返回了值為x1323ddx的ETag。當(dāng)資源/file的內(nèi)容發(fā)生變化時(shí),服務(wù)器應(yīng)當(dāng)返回不同的ETag。

請(qǐng)求頭If-None-Match

對(duì)于同一個(gè)資源,比如上一例中的/file,在進(jìn)行了一次請(qǐng)求之后,瀏覽器就已經(jīng)有了/file的一個(gè)版本的內(nèi)容,和這個(gè)版本的ETag,當(dāng)下次用 戶再需要這個(gè)資源,瀏覽器再次向服務(wù)器請(qǐng)求的時(shí)候,可以利用請(qǐng)求頭If-None-Match來告訴服務(wù)器自己已經(jīng)有個(gè)ETag為x1323ddx的 /file,這樣,如果服務(wù)器上的/file沒有變化,也就是說服務(wù)器上的/file的ETag也是x1323ddx的話,服務(wù)器就不會(huì)再返回/file 的內(nèi)容,而是返回一個(gè)304的響應(yīng),告訴瀏覽器該資源沒有變化,緩存有效。

HttpCache

如上例中所示,在使用了If-None-Match之后,服務(wù)器只需要很小的響應(yīng)就可以達(dá)到相同的結(jié)果,從而優(yōu)化了性能。

響應(yīng)頭Cache-Control

每個(gè)資源都可以通過Http頭Cache-Control來定義自己的緩存策略,Cache-Control控制誰在什么條件下可以緩存響應(yīng)以及可 以緩存多久。 最快的請(qǐng)求是不必與服務(wù)器進(jìn)行通信的請(qǐng)求:通過響應(yīng)的本地副本,我們可以避免所有的網(wǎng)絡(luò)延遲以及數(shù)據(jù)傳輸?shù)臄?shù)據(jù)成本。為此,HTTP 規(guī)范允許服務(wù)器返回一系列不同的 Cache-Control 指令,控制瀏覽器或者其他中繼緩存如何緩存某個(gè)響應(yīng)以及緩存多長(zhǎng)時(shí)間。

Cache-Control 頭在 HTTP/1.1 規(guī)范中定義,取代了之前用來定義響應(yīng)緩存策略的頭(例如 Expires)。當(dāng)前的所有瀏覽器都支持 Cache-Control,因此,使用它就夠了。

以下我來介紹可以再Cache-Control中設(shè)置的常用指令。

max-age

該指令指定從當(dāng)前請(qǐng)求開始,允許獲取的響應(yīng)被重用的最長(zhǎng)時(shí)間(單位為秒。例如:Cache-Control:max-age=60表示響應(yīng)可以再緩 存和重用 60 秒。需要注意的是,在max-age指定的時(shí)間之內(nèi),瀏覽器不會(huì)向服務(wù)器發(fā)送任何請(qǐng)求,包括驗(yàn)證緩存是否有效的請(qǐng)求,也就是說,如果在這段時(shí)間之內(nèi),服務(wù) 器上的資源發(fā)生了變化,那么瀏覽器將不能得到通知,而使用老版本的資源。所以在設(shè)置緩存時(shí)間的長(zhǎng)度時(shí),需要慎重。

public和private

如果設(shè)置了public,表示該響應(yīng)可以再瀏覽器或者任何中繼的Web代理中緩存,public是默認(rèn)值,即Cache-Control:max-age=60等同于Cache-Control:public, max-age=60。

在服務(wù)器設(shè)置了private比如Cache-Control:private, max-age=60的情況下,表示只有用戶的瀏覽器可以緩存private響應(yīng),不允許任何中繼Web代理對(duì)其進(jìn)行緩存 – 例如,用戶瀏覽器可以緩存包含用戶私人信息的 HTML 網(wǎng)頁,但是 CDN 不能緩存。

no-cache

如果服務(wù)器在響應(yīng)中設(shè)置了no-cache即Cache-Control:no-cache,那么瀏覽器在使用緩存的資源之前,必須先與服務(wù)器確認(rèn) 返回的響應(yīng)是否被更改,如果資源未被更改,可以避免下載。這個(gè)驗(yàn)證之前的響應(yīng)是否被修改,就是通過上面介紹的請(qǐng)求頭If-None-match和響應(yīng)頭 ETag來實(shí)現(xiàn)的。

需要注意的是,no-cache這個(gè)名字有一點(diǎn)誤導(dǎo)。設(shè)置了no-cache之后,并不是說瀏覽器就不再緩存數(shù)據(jù),只是瀏 覽器在使用緩存數(shù)據(jù)時(shí),需要先確認(rèn)一下數(shù)據(jù)是否還跟服務(wù)器保持一致。如果設(shè)置了no-cache,而ETag的實(shí)現(xiàn)沒有反應(yīng)出資源的變化,那就會(huì)導(dǎo)致瀏覽 器的緩存數(shù)據(jù)一直得不到更新的情況。

no-store

如果服務(wù)器在響應(yīng)中設(shè)置了no-store即Cache-Control:no-store,那么瀏覽器和任何中繼的Web代理,都不會(huì)存儲(chǔ)這次相應(yīng)的數(shù)據(jù)。當(dāng)下次請(qǐng)求該資源時(shí),瀏覽器只能重新請(qǐng)求服務(wù)器,重新從服務(wù)器讀取資源。

怎樣決定一個(gè)資源的Cache-Control策略呢?

下面這個(gè)流程圖,可以幫到你。

HttpCache

 

責(zé)任編輯:王雪燕 來源: 程序員趙鑫
相關(guān)推薦

2022-08-08 15:45:44

JavaPromise前端

2019-01-04 12:46:03

程序員技能溝通

2010-12-30 10:04:49

Linux入門

2018-08-13 13:56:24

2015-08-14 13:51:22

程序員

2017-12-15 15:09:42

2020-07-13 08:08:05

程序員軟考原理

2015-06-11 13:12:56

2020-03-02 09:50:50

程序員技能開發(fā)者

2014-08-13 10:38:01

2021-09-14 11:10:20

程序員技能開發(fā)者

2013-08-20 09:33:59

程序員

2024-05-06 00:00:00

2019-05-16 08:36:53

Eureka緩存網(wǎng)關(guān)

2009-02-19 11:02:17

2022-08-08 10:45:49

PromiseJava腳手架

2011-05-13 14:34:02

程序員

2020-02-14 15:16:16

程序員表白浪漫

2017-11-14 21:30:15

2012-11-22 14:00:26

程序員
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)