摘要:但這兩個響應頭不是為了控制緩存,而是為了確認修改的資源的一致性。所以就產生了下面更加高級的緩存控制方法第三第四項方法。過期控制指定相對于請求時間的過期時間,以秒為單位。在的值前如果有則表示這是一個弱。表示要求上傳的文件在服務器上不存在。
現在的Web應用越來越復雜,體驗越來越好。相應的,資源文件也越來越大,如果能讓客戶端在資源沒更新的情況下,直接取用緩存的數據,那么不僅資源加載的更快,服務器壓力更小,也為綠色地球做出了一份貢獻。
程序員向來是追求最優,在設法緩存靜態資源以后,大家又找到了一些方法來緩存動態生成的內容。看來程序員們都是環境保護主義者(笑。
從HTTP/1.0-HTTP/1.1,一共產生了3種控制緩存的方法:
Expires(響應頭,HTTP/1.0)
Cache-Control(響應頭,HTTP/1.1)
- Last-Modified(響應頭),If-Modified-Since(請求頭) - Etag(響應頭),If-None-Match(請求頭)
以上就是HTTP控制緩存的方法。
HTTP/1.0 Expires除了這些,在第二個還有If-Unmodified-Since,第三個還有If-Match。但這兩個響應頭不是為了控制緩存,而是為了確認修改的資源的一致性。之后會介紹。
Expires:
其中
Date:, : : GMT Example: Fri, 03 Nov 2017 03:22:39 GMT
當設置了Expires后,客戶端在此日期之前都不會去請求服務器,而是直接從緩存中取。
不過這樣也有一個問題:如果完全不去請求服務器的話,在資源過期之前如果資源有更新,客戶端還是使用著之前的資源。所以就產生了下面更加高級的緩存控制方法(第三、第四項方法)。
HTTP/1.1 Cache-Control不過還有一個方法能解決這個問題:將資源的Expires設置為一個足夠長的時間,而資源名為資源的Hash值,這樣資源更新了以后,也使用的是不同的名稱。那么就不存在上面的問題了。
Expires只能設置具體的日期,這樣的話,如果客戶端與服務器的時間不一致,會導致緩存時間不正確,還有可能直接導致緩存失效。
HTTP/1.1的Cache-Control配合If-Modified-Since或If-None-Match則完美的解決了這個問題。
Cache-Control比較常用的指令如下:
可緩存性
public: 響應可被任意緩存
private: 響應只能被客戶端緩存,不能被中間節點(代理、CDN等)緩存
no-cache: 中間節點必須向原始服務器去驗證緩存有效性。如果本身是原始服務器,則向自己確認
only-if-cached: 中間節點直接使用已存在的緩存來確認有效性,不向原始服務器確認。若本身是原始服務器,則此指令沒有效果。
過期控制
max-age=
再驗證
must-revalidation: 緩存過期后必須向服務器確認緩存是否有效
其他
no-store: 忽略緩存的存在,直接向服務器請求最新的資源。
上面列表中向服務器確認緩存是否有效的技術手段就是下文介紹的 Last-Modified/If-Modified-Since 和 ETag/If-None-Match。
Last-Modified / If-Modified-SinceLast-Modified:
Last-Modified頭是服務器告訴客戶端此資源的最后修改時間,客戶端則會將資源和這個時間都儲存起來。之后,根據Cache-Control的指令,如果需要同服務器確認資源的有效性的時候則會將這個時間放在If-Modified-Since頭中,供服務器進行比較,是返回304還是200。
If-Unmodified-SinceIf-Modified-Since頭只會在GET和HEAD請求被附加進請求頭。
If-Unmodified-Since:
一般來說在PUT, POST等方法使用,表示該次請求更新的資源的日期為
ETag: W/"" ETag: " "
If-None-Match: ""[, " "...] If-None-Match: W/" "[, " "]
如果將上面的 Last-Modified / If-Modified-Since 應用在動態的數據上的話,基本上沒有可行性。那么就有了此方式的緩存。
在第一次請求的時候,服務器會附帶ETag頭。ETag的值是根據響應的內容來進行生成的,一般來說是內容(+其他一些標識的)哈希值。之后,根據Cache-Control的指令,如果需要同服務器確認資源的有效性的時候則會將這個etag_value放在If-None-Match頭中,供服務器進行比較,是返回304還是200。
在ETag的值前如果有W/則表示這是一個弱Etag。弱ETag相等意味著這兩個內容語義上是相等的,強ETag相等則表示內容每一個字節都相等。
舉個弱ETag的例子:返回的數據中帶有log信息,而兩次返回的數據是相同的,log不同。
If-Match還有一種語法:If-None-Match: *,基本上用在PUT, POST等上,用于上傳。表示要求上傳的文件在服務器上不存在。
If-Match: ""[, " "...] If-Match: W/" "[, " "]
對于GET, HEAD等請求,如果資源的ETag匹配上If-Match的值,則返回資源,否則返回412。
對于PUT, POST等請求,如果現有資源的Etag匹配上If-Match的值,那么進行寫操作,否則失敗返回412。
----- 記得點贊 -----
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/51457.html
摘要:發布配置支持程序自動發布配置,創建和修改配置使用同一個方法,配置不存在則創建配置已存在則更新。示例源碼項目代碼已上傳至碼云和上,歡迎下載學習參考資料用戶指南的推薦閱讀系列歡迎來到的世界系列基于的注冊中心系列基于的配置中心 Maven依賴 Nacos提供完整的Java SDK,便于配置管理和服務發現及管理,以 Nacos-0.8.0 版本為例 添加Maven依賴: com.al...
摘要:類實際上是中中的緩存類,目的是節省內存消耗,提高程序性能。而當堆內存中的對象存儲非常多時,就有可能造成內存泄漏。使用頻率高創建對象也就越多,堆內存中的對象也就越多,所以也就會可能發生上述中的內存溢出等問題。 面試題:問以下代碼輸出的結果是多少? public class IntegerTest { @Test public void test() { ...
摘要:對于偽共享的傳統解決方案微信公眾號技術棧以上使用此方法的某個版本對偽共享做了優化以下使用此方法中的解決方案中已經提供了官方的解決方案,中新增了一個注解。 1. 什么是偽共享 CPU 緩存系統中是以緩存行(cache line)為單位存儲的。目前主流的 CPU Cache 的 Cache Line 大小都是 64 Bytes。在多線程情況下,如果需要修改共享同一個緩存行的變量,就會無意中...
閱讀 1953·2021-09-30 09:46
閱讀 1366·2019-08-30 15:43
閱讀 1123·2019-08-29 13:28
閱讀 1922·2019-08-29 11:24
閱讀 1681·2019-08-26 13:22
閱讀 3892·2019-08-26 12:01
閱讀 1816·2019-08-26 11:33
閱讀 3242·2019-08-23 15:34