http快取機制分為兩種,客戶端快取和服務端快取,本文主要對客戶端快取進行簡單的分析。服務端快取又分為 **伺服器快取 和 反向**伺服器快取(也叫閘道器快取,比如 nginx反向**、squid等),其實廣泛使用的 cdn 也是一種服務端快取,目的都是讓使用者的請求走」捷徑「,並且都是快取、檔案等靜態資源。
客戶端側快取一般指的是瀏覽器快取,目的就是加速各種靜態資源的訪問,想想現在的大型**,隨便乙個頁面都是一兩百個請求,每天 pv 都是億級別,如果沒有快取,使用者體驗會急劇下降、同時伺服器壓力和網路頻寬都面臨嚴重的考驗。
客戶端快取主要是http協議定義的快取機制(如 expires, cache-control欄位), 也有非http協議定義的快取,使用http-mate標籤
如
http-equiv="pragma"
content="no-cache">
上述**的作用是告訴瀏覽器當前頁面不被快取,每次訪問都需要去伺服器拉取。使用上很簡單,但只有部分瀏覽器可以支援,而且所有快取**伺服器都不支援,因為**不解析html內容本身。
expires是web伺服器響應訊息頭欄位,在響應http請求時告訴瀏覽器在過期時間前瀏覽器可以直接從瀏覽器緩訪問資料,而無需再次請求。
date頭域表示訊息傳送的時間,時間的描述格式由rfc822定義。例如,date: mon,31 dec 2001 04:25:57gmt。
web伺服器告訴瀏覽器在2012-11-28 03:30:01這個時間點之前,可以使用快取檔案。傳送請求的時間是2012-11-28 03:25:01,即快取5分鐘。
不過expires 是http 1.0的東西,現在預設瀏覽器均預設使用http 1.1,所以它的作用基本忽略。
cache-control與expires的作用一致,都是指明當前資源的有效期,控制瀏覽器是否直接從瀏覽器緩訪問資料還是重新發請求到伺服器取資料。只不過cache-control的選擇更多,設定更細緻,如果同時設定的話,其優先順序高於expires。
http-header中的cache-control欄位:
可以是public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age
各個訊息中的指令含義如下:
還是上面那個請求,web伺服器返回的cache-control頭的值為max-age=300,即5分鐘(和上面的expires時間一致,這個不是必須的)。
last-modified/if-modified-since
last-modified/if-modified-since要配合cache-control使用。
etag/if-none-match
etag/if-none-match也要配合cache-control使用。
既生last-modified何生etag?
你可能會覺得使用last-modified已經足以讓瀏覽器知道本地的快取副本是否足夠新,為什麼還需要etag(實體標識)呢?http1.1中etag的出現主要是為了解決幾個last-modified比較難解決的問題:
etag是伺服器自動生成或者由開發者生成的對應資源在伺服器端的唯一識別符號,能夠更加準確的控制快取。last-modified與etag是可以一起使用的,伺服器會優先驗證etag,一致的情況下,才會繼續比對last-modified,最後才決定是否返回304。
使用者操作
expires/cache-control
last-modified/etag
位址列回車
有效有效
頁面鏈結跳轉
有效有效
新開視窗
有效有效
前進、後退
無效有效
ctrl+f5重新整理
無效無效
瀏覽器的第一次請求
瀏覽器再次請求時
客戶端快取
你的 在併發訪問很大並且無法承受壓力的情況下,你會選擇如何優化?很 多人首先會想從伺服器快取方面著手對程式進行優化,許多不同的伺服器快取方式都有他們自己的特點,像我曾經參與的一些專案中,根據快取的命中率不同使用過 com enterprise libiary caching windows服務,靜態...
php http 快取 客戶端快取
expires 過期時間 cache control 響應頭資訊 max age 秒 快取過期時間 請求時間開始到過期時間的秒數 s maxage 秒 快取過期時間 public 標記認證內容能被快取,一般而言輸出是不能被快取的,no cache 無快取,表示直接讀取資料源,no store 強制快...
安卓客戶端快取機制
在手機客戶端的應用中,如果經常訪問伺服器,那麼不僅伺服器的壓力就會比較大,而且載入慢導致使用者體驗不是很好,現在快取可以解決這一問題,靈活的快取可以說不僅大大減輕了伺服器的壓力,而且因為更快速的使用者體驗而方便了使用者。採用快取,可以進一步大大緩解資料互動的壓力,我們簡略列舉一下快取管理的適用環境 ...