成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

「MISC」HTTP 緩存控制

RancherLabs / 3013人閱讀

摘要:但這兩個(gè)響應(yīng)頭不是為了控制緩存,而是為了確認(rèn)修改的資源的一致性。所以就產(chǎn)生了下面更加高級(jí)的緩存控制方法第三第四項(xiàng)方法。過期控制指定相對(duì)于請(qǐng)求時(shí)間的過期時(shí)間,以秒為單位。在的值前如果有則表示這是一個(gè)弱。表示要求上傳的文件在服務(wù)器上不存在。

現(xiàn)在的Web應(yīng)用越來越復(fù)雜,體驗(yàn)越來越好。相應(yīng)的,資源文件也越來越大,如果能讓客戶端在資源沒更新的情況下,直接取用緩存的數(shù)據(jù),那么不僅資源加載的更快,服務(wù)器壓力更小,也為綠色地球做出了一份貢獻(xiàn)。

程序員向來是追求最優(yōu),在設(shè)法緩存靜態(tài)資源以后,大家又找到了一些方法來緩存動(dòng)態(tài)生成的內(nèi)容??磥沓绦騿T們都是環(huán)境保護(hù)主義者(笑。

從HTTP/1.0-HTTP/1.1,一共產(chǎn)生了3種控制緩存的方法:

Expires(響應(yīng)頭,HTTP/1.0)

Cache-Control(響應(yīng)頭,HTTP/1.1)

- Last-Modified(響應(yīng)頭),If-Modified-Since(請(qǐng)求頭)
- Etag(響應(yīng)頭),If-None-Match(請(qǐng)求頭)

以上就是HTTP控制緩存的方法。

除了這些,在第二個(gè)還有If-Unmodified-Since,第三個(gè)還有If-Match。但這兩個(gè)響應(yīng)頭不是為了控制緩存,而是為了確認(rèn)修改的資源的一致性。之后會(huì)介紹。

HTTP/1.0 Expires
Expires: 

其中 的格式如下:

Date: ,    :: GMT
Example: Fri, 03 Nov 2017 03:22:39 GMT

當(dāng)設(shè)置了Expires后,客戶端在此日期之前都不會(huì)去請(qǐng)求服務(wù)器,而是直接從緩存中取。
不過這樣也有一個(gè)問題:如果完全不去請(qǐng)求服務(wù)器的話,在資源過期之前如果資源有更新,客戶端還是使用著之前的資源。所以就產(chǎn)生了下面更加高級(jí)的緩存控制方法(第三、第四項(xiàng)方法)。

不過還有一個(gè)方法能解決這個(gè)問題:將資源的Expires設(shè)置為一個(gè)足夠長(zhǎng)的時(shí)間,而資源名為資源的Hash值,這樣資源更新了以后,也使用的是不同的名稱。那么就不存在上面的問題了。

HTTP/1.1 Cache-Control

Expires只能設(shè)置具體的日期,這樣的話,如果客戶端與服務(wù)器的時(shí)間不一致,會(huì)導(dǎo)致緩存時(shí)間不正確,還有可能直接導(dǎo)致緩存失效。

HTTP/1.1的Cache-Control配合If-Modified-Since或If-None-Match則完美的解決了這個(gè)問題。

Cache-Control比較常用的指令如下:

可緩存性

public: 響應(yīng)可被任意緩存

private: 響應(yīng)只能被客戶端緩存,不能被中間節(jié)點(diǎn)(代理、CDN等)緩存

no-cache: 中間節(jié)點(diǎn)必須向原始服務(wù)器去驗(yàn)證緩存有效性。如果本身是原始服務(wù)器,則向自己確認(rèn)

only-if-cached: 中間節(jié)點(diǎn)直接使用已存在的緩存來確認(rèn)有效性,不向原始服務(wù)器確認(rèn)。若本身是原始服務(wù)器,則此指令沒有效果。

過期控制

max-age=: 指定相對(duì)于請(qǐng)求時(shí)間的過期時(shí)間,以秒為單位。

再驗(yàn)證

must-revalidation: 緩存過期后必須向服務(wù)器確認(rèn)緩存是否有效

其他

no-store: 忽略緩存的存在,直接向服務(wù)器請(qǐng)求最新的資源。

上面列表中向服務(wù)器確認(rèn)緩存是否有效的技術(shù)手段就是下文介紹的 Last-Modified/If-Modified-SinceETag/If-None-Match。

Last-Modified / If-Modified-Since
Last-Modified: 

Last-Modified頭是服務(wù)器告訴客戶端此資源的最后修改時(shí)間,客戶端則會(huì)將資源和這個(gè)時(shí)間都儲(chǔ)存起來。之后,根據(jù)Cache-Control的指令,如果需要同服務(wù)器確認(rèn)資源的有效性的時(shí)候則會(huì)將這個(gè)時(shí)間放在If-Modified-Since頭中,供服務(wù)器進(jìn)行比較,是返回304還是200。

If-Modified-Since頭只會(huì)在GET和HEAD請(qǐng)求被附加進(jìn)請(qǐng)求頭。

If-Unmodified-Since
If-Unmodified-Since: 

一般來說在PUT, POST等方法使用,表示該次請(qǐng)求更新的資源的日期為,如果服務(wù)器檢測(cè)到現(xiàn)存資源的日期不為(即已經(jīng)被其他的方式更新了),則會(huì)失敗并返回412。

ETag / If-None-Match
ETag: W/""
ETag: ""
If-None-Match: ""[, ""...]
If-None-Match: W/""[, ""]

如果將上面的 Last-Modified / If-Modified-Since 應(yīng)用在動(dòng)態(tài)的數(shù)據(jù)上的話,基本上沒有可行性。那么就有了此方式的緩存。

在第一次請(qǐng)求的時(shí)候,服務(wù)器會(huì)附帶ETag頭。ETag的值是根據(jù)響應(yīng)的內(nèi)容來進(jìn)行生成的,一般來說是內(nèi)容(+其他一些標(biāo)識(shí)的)哈希值。之后,根據(jù)Cache-Control的指令,如果需要同服務(wù)器確認(rèn)資源的有效性的時(shí)候則會(huì)將這個(gè)etag_value放在If-None-Match頭中,供服務(wù)器進(jìn)行比較,是返回304還是200。

在ETag的值前如果有W/則表示這是一個(gè)弱Etag。弱ETag相等意味著這兩個(gè)內(nèi)容語義上是相等的,強(qiáng)ETag相等則表示內(nèi)容每一個(gè)字節(jié)都相等。

舉個(gè)弱ETag的例子:返回的數(shù)據(jù)中帶有l(wèi)og信息,而兩次返回的數(shù)據(jù)是相同的,log不同。

還有一種語法:If-None-Match: *,基本上用在PUT, POST等上,用于上傳。表示要求上傳的文件在服務(wù)器上不存在。

If-Match
If-Match: ""[, ""...]
If-Match: W/""[, ""]

對(duì)于GET, HEAD等請(qǐng)求,如果資源的ETag匹配上If-Match的值,則返回資源,否則返回412。
對(duì)于PUT, POST等請(qǐng)求,如果現(xiàn)有資源的Etag匹配上If-Match的值,那么進(jìn)行寫操作,否則失敗返回412。

----- 記得點(diǎn)贊 -----

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/51457.html

相關(guān)文章

  • Nacos系列:Nacos的Java SDK使用

    摘要:發(fā)布配置支持程序自動(dòng)發(fā)布配置,創(chuàng)建和修改配置使用同一個(gè)方法,配置不存在則創(chuàng)建配置已存在則更新。示例源碼項(xiàng)目代碼已上傳至碼云和上,歡迎下載學(xué)習(xí)參考資料用戶指南的推薦閱讀系列歡迎來到的世界系列基于的注冊(cè)中心系列基于的配置中心 Maven依賴 Nacos提供完整的Java SDK,便于配置管理和服務(wù)發(fā)現(xiàn)及管理,以 Nacos-0.8.0 版本為例 添加Maven依賴: com.al...

    LinkedME2016 評(píng)論0 收藏0
  • IntegerCache

    摘要:類實(shí)際上是中中的緩存類,目的是節(jié)省內(nèi)存消耗,提高程序性能。而當(dāng)堆內(nèi)存中的對(duì)象存儲(chǔ)非常多時(shí),就有可能造成內(nèi)存泄漏。使用頻率高創(chuàng)建對(duì)象也就越多,堆內(nèi)存中的對(duì)象也就越多,所以也就會(huì)可能發(fā)生上述中的內(nèi)存溢出等問題。 面試題:?jiǎn)栆韵麓a輸出的結(jié)果是多少? public class IntegerTest { @Test public void test() { ...

    yiliang 評(píng)論0 收藏0
  • Java 中的偽共享詳解及解決方案

    摘要:對(duì)于偽共享的傳統(tǒng)解決方案微信公眾號(hào)技術(shù)棧以上使用此方法的某個(gè)版本對(duì)偽共享做了優(yōu)化以下使用此方法中的解決方案中已經(jīng)提供了官方的解決方案,中新增了一個(gè)注解。 1. 什么是偽共享 CPU 緩存系統(tǒng)中是以緩存行(cache line)為單位存儲(chǔ)的。目前主流的 CPU Cache 的 Cache Line 大小都是 64 Bytes。在多線程情況下,如果需要修改共享同一個(gè)緩存行的變量,就會(huì)無意中...

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

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

0條評(píng)論

RancherLabs

|高級(jí)講師

TA的文章

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