1. 程式人生 > >http緩存機制

http緩存機制

定期 sin 轉發 重復 才會 定義 ron 開發者 利用

web開發過程中,緩存是老生常談的一個話題。本文從緩存的定義、作用、分類、機制等方面介紹http緩存及其原理。希望能對大家有所幫助,如有紕漏,還請提出指正。

什麽是web緩存

  根據MDN上的解釋,緩存是指存儲指定資源的一份拷貝,並在下次請求該資源的時候提供這份拷貝而非源文件的技術。當 web 緩存發現請求的資源已經被存儲,它會攔截請求,返回該資源的拷貝,而不會去源服務器重新下載。

緩存的作用

  1、減少網絡帶寬消耗,降低運營成本

  2、降低服務器壓力。給網絡資源設定有效期之後,用戶可以重復使用本地的緩存,減少對源服務器的請求,間接降低服務器的壓力。同時,搜索引擎的爬蟲機器人也能根據過期機制降低爬取的頻率,也能有效降低服務器的壓力

  3、減少網絡延遲,加快頁面打開速度,提升用戶體驗。

緩存類型

  1、數據庫緩存

  在大型web應用開發過程中,會對數據庫進行頻繁查詢,容易導致數據庫不堪重負,我們一般會將首次查詢出的數據放入內存中進行緩存,下次查詢時,直接從內存中獲取,而不用再次查詢數據庫,從而提升響應效率。常用的數據庫緩存方案有memcached和redis。二者的區別本次不做討論

  2、服務器端緩存

  代理服務器緩存:當代理服務器轉發源服務器返回的響應時,將保存一份資源的副本。可以把它理解成一個共享緩存,共享緩存存儲的響應能夠被多個用戶使用。緩存服務器的優勢在於利用緩存可以避免多次從源服務器轉發資源,客戶端可以就近從緩存服務器獲取資源,源服務器也就不必多次處理相同的請求了。

  cdn緩存:也叫網關緩存或者反向代理緩存。從瀏覽器的角度來看,整個cdn就是一個源服務器。

  3、客戶端緩存

  也叫瀏覽器緩存或者是私有緩存,瀏覽器緩存根據一套與服務器約定的規則進行工作,在同一個會話過程中會檢查一次並確定緩存的副本足夠新。這些規則是在HTTP協議頭和HTML頁面的Meta標簽中定義。需要註意的是meta標簽的http-equiv屬性只有部分瀏覽器可以支持,而且所有緩存代理服務器都不支持,因為代理不解析HTML內容本身。瀏覽器會在你的硬盤上專門開辟一個空間專門為你存儲資源副本。這些緩存為瀏覽過的文檔提供向後/向前導航,保存網頁,查看源碼等功能,可以避免再次向服務器發起多余的請求。它同樣可以提供緩存內容的離線瀏覽。如果你瀏覽過程中,比如前進或後退,訪問到同一個圖片,這些圖片可以從瀏覽器緩存中調出而即時顯現。

緩存策略

  1、緩存存儲策略

通過http響應頭Cache-Control 頭裏的 public、private、no-cache、max-age 、no-store來決定http響應內容是否可以被客戶端緩存,前4個都會緩存數據到本地,而no-store則不會在客戶端緩存任何響應數據(需要明白的是no-cache只是不緩存過期資源,而並不是不緩存)。數據緩存到本地後瀏覽器並不是直接使用,而是先要確定緩存是否過期(見下文)。

  2、緩存過期策略

Cache-Control、Expires指明當前資源的有效期,控制客戶端是否直接從瀏覽器緩存取數據還是重新發請求到服務器取數據。客戶端通過這兩個字段確認存儲在本地的緩存數據是否已過期(比較max-age和age或者Expires和Date),從而決定是否要發送請求到服務器重新下載一份資源。需要註意的是Cache-Control的優先級高於Expires,同時存在時前者會覆蓋後者。如果Cache-Control不存在,則會檢查是否包含Expires,如果Expires不存在,那麽緩存壽命就是Date的值減去Last-Modified的值除以10。緩存過期只是告訴客戶端先不要從本地讀取緩存,並不是從此就沒用了,等到發送請求到源服務器確認後,如果文件沒有被修改,那麽還會接著使用(見下文)。

  3、緩存校驗策略

  戶端檢測到數據過期或瀏覽器刷新後,會重新向源服務器發送一個http請求,服務器並不急於返回響應,而是先通過Last-Modified與ETag來判斷資源是否有被更改。

Last-Modified/If-Modified-Since

Last-Modified: 緩存的弱校驗器,標示這個響應資源的最後修改時間。web服務器在響應請求時,告訴瀏覽器資源的最後修改時間。

If-Modified-Since:當資源過期時,發現資源具有Last-Modified聲明,則再次向web服務器請求時帶上頭 If-Modified-Since,表示請求時間。web服務器收到請求後發現有頭If-Modified-Since 則與被請求資源的最後修改時間進行比對。若最後修改時間較新,說明資源又被改動過,則響應整片資源內容(寫在響應消息包體內),HTTP 200;若最後修改時間較舊,說明資源無新修改,則響應HTTP 304 (無body,節省瀏覽),告知瀏覽器繼續使用所保存的cache。

Etag/If-None-Match

Etag:緩存的強校驗器,web服務器響應請求時,告訴瀏覽器當前資源在服務器的唯一標識。Apache中,ETag的值,默認是對文件的索引節(INode),大小(Size)和最後修改時間(MTime)進行Hash後得到的。

If-None-Match:當資源過期時(使用Cache-Control標識的max-age),發現資源具有Etage聲明,則再次向web服務器請求時帶上頭If-None-Match (Etag的值)。web服務器收到請求後發現有頭If-None-Match 則與被請求資源的相應校驗串進行比對,決定返回200或304。

Last-Modified與ETag

Last-Modified已經足以讓瀏覽器知道本地的緩存副本是否足夠新,為什麽還需要Etag(實體標識)呢?HTTP1.1中Etag的出現主要是為了解決幾個Last-Modified比較難解決的問題

Last-Modified標註的最後修改只能精確到秒級,如果某些文件在1秒鐘以內,被修改多次的話,它將不能準確標註文件的修改時間

如果某些文件會被定期生成,當有時內容並沒有任何變化,但Last-Modified卻改變了,導致文件沒法使用緩存

有可能存在服務器沒有準確獲取文件修改時間,或者與代理服務器時間不一致等情形

Etag是服務器或者由開發者生成的對應資源在服務器端的唯一標識符,能夠更加準確的控制緩存。Last-Modified與ETag是可以一起使用的,服務器會優先驗證ETag,一致的情況下,才會繼續比對Last-Modified,最後才決定是否返回304。

總結

重用已獲取的資源能夠有效的提升網站與應用的性能。Web 緩存能夠減少延遲與網絡阻塞,進而減少顯示某個資源所用的時間。借助 HTTP 緩存,Web 站點變得更具有響應性。

http緩存機制