日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

前言

上一篇互聯(lián)網(wǎng)架構(gòu)重要組員CDN,很多高級開發(fā)都沒有實(shí)操過,來看這里老顧介紹了CDN相關(guān)的知識,最后留了一下問題,就是緩存控制,今天老顧介紹一下如何控制緩存?

Cache Control響應(yīng)頭

首先我們先來看一下Cache Control這個概念,我們先看一下訪問一個網(wǎng)站,觀察一下響應(yīng)頭部

CDN緩存控制原理,你了解多少?

 

我們發(fā)現(xiàn)cache-control的值為max-age=31536000,從字面上面就能夠猜出它的含義,就是服務(wù)端告訴客戶端此信息可不可以緩存,以什么樣的策略進(jìn)行緩存;cache-control有哪些類型的值呢?

1、private:客戶端可以緩存

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

小伙伴們會疑惑什么是代理服務(wù)器可以緩存?我們用戶電腦訪問web站點(diǎn)之間,很有可能會經(jīng)過類似Nginx的反向代理服務(wù)器,也有可能會經(jīng)過我們正向代理的服務(wù)器,也有可能會經(jīng)過CDN網(wǎng)絡(luò)

因此我們中間層的服務(wù)節(jié)點(diǎn),發(fā)現(xiàn)cache-control的值為private時,就認(rèn)可只有發(fā)起請求的客戶端能夠緩存,作為代理服務(wù)節(jié)點(diǎn)是不能夠緩存的。如為public時代理服務(wù)器也可以緩存。

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

這個意思就是在客戶端收到信息后,信息會緩存xxx秒;過了xxx秒客戶端必須重新獲取信息。

4、no-store:不緩存請求的任何返回內(nèi)容

不緩存請求返回的任何內(nèi)容

5、no-cache:強(qiáng)制向服務(wù)器端再驗(yàn)證一次

no-cache和no-store的區(qū)別就是,no-cache會緩存請求返回的內(nèi)容,而no-store不緩存;但no-cache時,在下次用緩存的內(nèi)容時,需要向服務(wù)器驗(yàn)證一下,緩存到底能不能用

邏輯流程圖

CDN緩存控制原理,你了解多少?

 

流程圖中,服務(wù)根據(jù)自身的業(yè)務(wù),設(shè)置cache-control的值為:no-store、no-cache等,如:

Cache-Control: public, max-age=86400

在邏輯流程圖中,有一個環(huán)節(jié)就是重新驗(yàn)證,就是驗(yàn)證緩存內(nèi)容是否有效,那驗(yàn)證邏輯是什么,怎么驗(yàn)證

ETag驗(yàn)證

ETag:資源唯一標(biāo)識

一般會把請求的內(nèi)容做md5加密,返回唯一的標(biāo)識;會把ETag的值一起返回給瀏覽器;瀏覽器會把ETag存儲下來。

Etag: "5d8c72a5edda83343d6aere"

下一次請求時將Etag一并帶過去給服務(wù)器,服務(wù)器只需要比較客戶端傳來的ETag跟自己服務(wù)器上該資源的ETag是否一致,就能很好地判斷資源相對客戶端而言是否被修改過了

如果服務(wù)器發(fā)現(xiàn)ETag匹配不上,那么直接以常規(guī)GET 200狀態(tài)碼形式將新的資源(當(dāng)然也包括了新的ETag)發(fā)給客戶端;如果ETag是一致的,則直接返回304狀態(tài)碼客戶端直接使用本地緩存即可。

那么客戶端是如何把標(biāo)記在資源上的ETag傳回給服務(wù)器的呢?請求報文中有兩個首部字段可以帶上ETag值:

1、If-None-Match: ETag-value

If-None-Match: "5d8c72a5edda83343d6aere" 告訴服務(wù)端如果ETag沒匹配上需要重發(fā)資源數(shù)據(jù),否則直接回送304和響應(yīng)報頭即可。

當(dāng)前各瀏覽器均是使用的該請求首部來向服務(wù)器傳遞保存的ETag值。

2、If-Match: ETag-value

告訴服務(wù)器如果沒有匹配到ETag,或者收到了“*”值而當(dāng)前并沒有該資源實(shí)體,則應(yīng)當(dāng)返回412(Precondition Failed) 狀態(tài)碼給客戶端。否則服務(wù)器直接忽略該字段。

需要注意的是,如果資源是走分布式服務(wù)器(比如CDN)存儲的情況,需要這些服務(wù)器上計(jì)算ETag唯一值的算法保持一致,才不會導(dǎo)致明明同一個文件,在服務(wù)器A和服務(wù)器B上生成的ETag卻不一樣。

ETag優(yōu)點(diǎn):

1、可以更加精確的判斷資源是否被修改,可以識別一秒內(nèi)多次修改的情況。

2、不存在版本問題,每次請求都回去服務(wù)器進(jìn)行校驗(yàn)。

缺點(diǎn):

1、計(jì)算ETag值需要性能損耗。

2、分布式服務(wù)器存儲的情況下,計(jì)算ETag的算法如果不一樣,會導(dǎo)致瀏覽器從一臺服務(wù)器上獲得頁面內(nèi)容后到另外一臺服務(wù)器上進(jìn)行驗(yàn)證時發(fā)現(xiàn)ETag不匹配的情況。

Last-Modified驗(yàn)證

服務(wù)器將資源傳遞給客戶端時,會將資源最后更改的時間以“Last-Modified: GMT”的形式加在實(shí)體首部上一起返回給客戶端。

Last-Modified: Sun, 28 Apr 2019 02:23:05 GMT

客戶端會為資源標(biāo)記上該信息,下次再次請求時,會把該信息附帶在請求頭中一并帶給服務(wù)器去做檢查,若傳遞的時間值與服務(wù)器上該資源最終修改時間是一致的,則說明該資源沒有被修改過,直接返回304狀態(tài)碼內(nèi)容為空

如果兩個時間不一致,則服務(wù)器會發(fā)回該資源并返回200狀態(tài)碼,和第一次請求時類似。這樣保證不向客戶端重復(fù)發(fā)出資源,也保證當(dāng)服務(wù)器有變化時,客戶端能夠得到最新的資源。

CDN緩存控制原理,你了解多少?

 

也類似ETag,客戶端請求報文頭,兩種參數(shù)

1、If-Modified-Since: Last-Modified-value

If-Modified-Since: Sun, 28 Apr 2019 02:23:05 GMT

該請求首部告訴服務(wù)器如果客戶端傳來的最后修改時間與服務(wù)器上的一致,則直接回送304 和響應(yīng)報頭即可。

當(dāng)前各瀏覽器均是使用的該請求參數(shù)來向服務(wù)器傳遞保存的 Last-Modified 值。

2、If-Unmodified-Since: Last-Modified-value

該值告訴服務(wù)器,若Last-Modified沒有匹配上(資源在服務(wù)端的最后更新時間改變了),則應(yīng)當(dāng)返回412(Precondition Failed) 狀態(tài)碼給客戶端。

Last-Modified 存在一個問題,如果在服務(wù)器上,一個資源被修改了,但其實(shí)際內(nèi)容根本沒發(fā)生改變,但修改時間變化了,會導(dǎo)致Last-Modified時間匹配不上而返回了整個實(shí)體給客戶端(跟客戶端緩存里有個一模一樣的資源);就是錯誤的判斷內(nèi)容改變了。

請求流程圖

CDN緩存控制原理,你了解多少?

 

上面的圖就是總結(jié)了一下之前所講的,比較容易理解,不理解回頭重新看。

瀏覽器刷新方式

1、在URI輸入欄中輸入然后回車

看cache-control對應(yīng)的max-age是否有效,根據(jù)上面的流程圖,進(jìn)入?yún)f(xié)商機(jī)制

2、F5/點(diǎn)擊工具欄中的刷新按鈕/右鍵菜單重新加載

去掉max-age或設(shè)置max-age=0,進(jìn)入上面的流程圖,進(jìn)入?yún)f(xié)商機(jī)制

3、Ctl+F5/commond+shift+R

去掉cache-control和協(xié)商頭,不管有沒有緩存,強(qiáng)制刷新,都要到Server服務(wù)器上面獲取數(shù)據(jù),返回200狀態(tài)碼

協(xié)商機(jī)制再次說明:比較ETag和Last-Modified到服務(wù)端,若服務(wù)端一致,沒有變化,則返回狀態(tài)碼304,不返回?cái)?shù)據(jù);否則返回狀態(tài)碼200,返回?cái)?shù)據(jù)

動態(tài)數(shù)據(jù)

根據(jù)上面的知識,我們?nèi)?strong>取動態(tài)數(shù)據(jù)時(如:ajax動態(tài)請求),服務(wù)端就可以利用上面的規(guī)則控制客戶端不要緩存,設(shè)置cache-control為max-age=0;且不設(shè)置ETag和Last-Modified就可以達(dá)到不緩存;反之如果要緩存數(shù)據(jù),設(shè)置相關(guān)的值就行了。

CDN自定義緩存策略

1、可自定義目錄的過期時間

不管源服務(wù)器的緩存過期是什么規(guī)則,CDN服務(wù)自定義目錄過期時間,假如1個小時,那1個小時后,CDN設(shè)置的緩存目錄里面的內(nèi)容會過期,會再去源服務(wù)器那邊獲取新的信息(簡稱回源)

2、可自定義后綴名過期時間

可根據(jù)后綴名設(shè)置緩存策略,如:html、js、css等

3、可自定義對應(yīng)權(quán)重

如設(shè)置了后綴名的權(quán)重比目錄過期高,那么就遵循后綴名過期規(guī)則

4、可通過界面或API強(qiáng)制CDN對應(yīng)的目錄進(jìn)行刷新(不一定會成功)

總結(jié)

現(xiàn)在的CDN產(chǎn)品已經(jīng)比較成熟,有后臺控制臺管理進(jìn)行緩存的配置,如果需要程序控制相關(guān)的緩存過期規(guī)則,可以用上面介紹的知識點(diǎn)配合使用。今天老顧就介紹到這里,謝謝!!!

分享到:
標(biāo)簽:緩存 CDN
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定