減小網絡帶寬消耗
下降服務器壓力
減小網絡延遲,加快頁面打開速度html
數據庫數據緩存:爲了提供查詢的性能,會將查詢後的數據放到內存中進行緩存,下次查詢時,直接從內存緩存直接返回,提供響應效率
代理服務器緩存:代理服務器是瀏覽器和源服務器之間的中間服務器,瀏覽器先向這個中間服務器發起Web請求,通過處理後(好比權限驗證,緩存匹配等),再將請求轉發到源服務器。
CDN緩存:瀏覽器先向CDN網關發起Web請求,網關服務器後面對應着一臺或多臺負載均衡源服務器,會根據它們的負載請求,動態將請求轉發到合適的源服務器上。雖然這種架構負載均衡源服務器之間的緩存無法共享,但卻擁有更好的處擴展性。從瀏覽器角度來看,整個CDN就是一個源服務器
瀏覽器端緩存
Web應用層緩存web
HTTP信息頭中包含Cache-Control:no-cache,pragma:no-cache,或Cache-Control:max-age=0等告訴瀏覽器不用緩存的請求
須要根據Cookie,認證信息等決定輸入內容的動態請求是不能被緩存的
通過HTTPS安全加密的請求
POST請求沒法被緩存
HTTP響應頭中不包含Last-Modified/Etag,也不包含Cache-Control/Expires的請求沒法被緩存數據庫
Web開發者能夠在HTML頁面的<head>節點中加入<meta>標籤,代碼以下:瀏覽器
<meta http-equiv="Pragma" content="no-cache">
上述代碼的做用是告訴瀏覽器當前頁面不被緩存,每次訪問都須要去服務器拉取。使用上很簡單,但只有部分瀏覽器能夠支持,並且全部緩存代理服務器都不支持,由於代理不解析HTML內容自己。緩存
Cache-Control與Expires的做用一致,都是指明當前資源的有效期,控制瀏覽器是否直接從瀏覽器緩存取數據仍是從新發請求到服務器取數據。只不過Cache-Control的選擇更多,設置更細緻,若是同時設置的話,其優先級高於Expires。
配置Last-Modified/ETag的狀況下,瀏覽器再次訪問統一URI的資源,仍是會發送請求到服務器詢問文件是否已經修改,若是沒有,服務器會只發送一個304回給瀏覽器,告訴瀏覽器直接從本身本地的緩存取數據;若是修改過那就整個數據從新發給瀏覽器;
Etag的出現主要是爲了解決幾個Last-Modified比較難解決的問題:
Last-Modified標註的最後修改只能精確到秒級,若是某些文件在1秒鐘之內,被修改屢次的話,它將不能準確標註文件的新鮮度
若是某些文件會被按期生成,當有時內容並無任何變化,但Last-Modified卻改變了,致使文件無法使用緩存
有可能存在服務器沒有準確獲取文件修改時間,或者與代理服務器時間不一致等情形安全
Cache-Control/Expires的優先級要高於Last-Modified/ETag。即當本地副本根據Cache-Control/Expires發現還在有效期內時,則不會再次發送請求去服務器詢問修改時間(Last-Modified)或實體標識(Etag)了。
使用Cache-Control/Expires會配合Last-Modified/ETag一塊兒使用,由於即便服務器設置緩存時間, 當用戶點擊「刷新」按鈕時,瀏覽器會忽略緩存繼續向服務器發送請求,這時Last-Modified/ETag將可以很好利用304,從而減小響應開銷。服務器
當用戶在按F5進行刷新的時候,會忽略Expires/Cache-Control的設置,會再次發送請求去服務器請求,而Last-Modified/Etag仍是有效的,服務器會根據狀況判斷返回304仍是200;而當用戶使用Ctrl+F5進行強制刷新的時候,只是全部的緩存機制都將失效,從新從服務器拉去資源
總結一下瀏覽器請求的過程:
Etag發送過去的頭名字叫:If-None-Match
Last-Modified發送過去的頭名字叫:If-Modified-Since
參考文獻:
Web緩存機制系列
瀏覽器緩存機制網絡