摘要:但這兩個(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控制緩存的方法。
HTTP/1.0 Expires除了這些,在第二個(gè)還有If-Unmodified-Since,第三個(gè)還有If-Match。但這兩個(gè)響應(yīng)頭不是為了控制緩存,而是為了確認(rèn)修改的資源的一致性。之后會(huì)介紹。
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)方法)。
HTTP/1.1 Cache-Control不過還有一個(gè)方法能解決這個(gè)問題:將資源的Expires設(shè)置為一個(gè)足夠長(zhǎng)的時(shí)間,而資源名為資源的Hash值,這樣資源更新了以后,也使用的是不同的名稱。那么就不存在上面的問題了。
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=
再驗(yàn)證
must-revalidation: 緩存過期后必須向服務(wù)器確認(rèn)緩存是否有效
其他
no-store: 忽略緩存的存在,直接向服務(wù)器請(qǐng)求最新的資源。
上面列表中向服務(wù)器確認(rèn)緩存是否有效的技術(shù)手段就是下文介紹的 Last-Modified/If-Modified-Since 和 ETag/If-None-Match。
Last-Modified / If-Modified-SinceLast-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-Unmodified-SinceIf-Modified-Since頭只會(huì)在GET和HEAD請(qǐng)求被附加進(jìn)請(qǐng)求頭。
If-Unmodified-Since:
一般來說在PUT, POST等方法使用,表示該次請(qǐng)求更新的資源的日期為
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-Match還有一種語法:If-None-Match: *,基本上用在PUT, POST等上,用于上傳。表示要求上傳的文件在服務(wù)器上不存在。
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
摘要:發(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...
摘要:類實(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() { ...
摘要:對(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ì)無意中...
閱讀 1986·2021-09-30 09:46
閱讀 1397·2019-08-30 15:43
閱讀 1150·2019-08-29 13:28
閱讀 1950·2019-08-29 11:24
閱讀 1728·2019-08-26 13:22
閱讀 4022·2019-08-26 12:01
閱讀 1848·2019-08-26 11:33
閱讀 3270·2019-08-23 15:34