HTTP緩存的應用,不僅僅是max-age

HTTP緩存的應用,不僅僅是max-age

來自專欄猿論

相信不管是做前端開發還是後端開發的同學,或多或少在開發過程中接觸過緩存的概念。最簡單的例子就是前端對於靜態資源--即css、js、圖片等文件資源進行緩存。但是大部分同學知道的可能就是設置Cache-Control: max-age=xxx來設置資源的過期時間,然而緩存的運用在互聯網中可謂是無處不在,一個好的緩存方案可以大大提升服務的性能,而一個不好的緩存方案可能會導致網站的可用性降低。所以今天我們就來聊聊HTTP協議中的緩存。

首先HTTP協議中主要涉及緩存的Header就是Cache-ControlExpires,目前階段來說Expires已經漸漸被淘汰了,所以我們主要講講Cache-Control

Cache-Control並不是只有指定max-age過期時間這麼一種使用方式,事實上這只是Cache-Control最基礎的用法,我們來看看Cache-Control有哪些可以設置的值

  1. private、public和no-cache用來指定客戶端和代理緩存的可緩存性
  2. max-age和s-maxage用來指定客戶端和代理緩存的緩存時間
  3. must-revalidate和proxy-revalidate用來指定緩存過期後是否必須驗證才能使用
  4. no-store用來表明任何地方都不應該緩存內容
  5. 其他一些不常用的設置

首先大家必須要弄清楚的一點是,緩存不僅僅只有瀏覽器可以緩存,互聯網中存在著各式各樣的代理緩存。HTTP僅僅是一個應用層的協議,在數據傳輸的過程中逃不開各種中繼的設備,而本身HTTP是明文傳輸的,所以每個中繼設備都可以解析HTTP數據包中的內容,所以如果某個中繼設備想,他就可以成為一個代理緩存(想想曾經的某些運行商做的事)。當然HTTP的代理緩存更多還是服務假設者自己做的,但是本質上是一個意思。

那麼相對於大家都知道的客戶端緩存,代理緩存有什麼好處呢?最明顯的優勢就是:客戶端緩存是一對一的,但是代理緩存是一對多的。

從這張圖中我們可以看到,對於同一個源伺服器可以存在不同的代理(有些CDN就近獲取資源就有用到緩存的知識)。如果這些代理都開啟來緩存功能,那麼用戶一在第一次訪問數據的時候,代理通過源伺服器獲取資源返回給用戶,並同時緩存來這個請求,這時候用戶二再次來請求的時候,就不需要經過源伺服器,直接從代理緩存讀取就可以來。

所以對於耗時操作而且數據修改不頻繁的數據,開啟代理緩存對於性能的提升是非常明顯的,哪怕你每次緩存的時間只有5秒,對於並發量很高請求帶來的性能提升也是不可估量的。

當然這個操作源伺服器通過自己設置緩存也可以實現,但是代理緩存的好處是,如果你的代理離用戶足夠近,那麼減少的延時也是非常明顯的。比如如果你的伺服器在美國紐約,如果你不在國內設置一個代理緩存,那麼所有數據都要跨國半個地球再繞回來,而有代理緩存的情況就不一樣來。

那麼說回來,怎麼控制代理緩存的使用?還是靠HTTP協議,在HTTP協議的發展歷史中,已經有非常多的實踐讓協議進行修改和發展,所以目前的緩存方案可以說已經比較完善了。一般來說,代理緩存伺服器都會對最新的HTTP協議的標準進行實現,並且適當兼容老得標準,一般不會出現一些魔改實現。所以只要你對HTTP協議的緩存方案充分了解,那麼你就可以很好得使用代理伺服器的緩存了。

最主要的你需要知道:

  1. 如何控制代理服務是否緩存或者緩存多少時間
  2. 代理緩存時候可以提供過期緩存的內容
  3. 如何進行緩存驗證

知道這些之後,配合一個好用的代理緩存,相信能對你的服務帶來很大的性能提升。以上的內容並不是特別好理解,如果大家有興趣可以去看一下我的新課HTTP協議原理+實踐 Web開發工程師必學,裡面對HTTP協議的原理,不同HEADER的作用和實踐、Nginx部署代理和緩存、HTTPS、HTTP2都有使用例展示進行深入的講解。

最後,HTTP協議是所有WEB相關開發的同學都必須要牢牢掌握的基礎,僅僅知道POST、GET、Content-Type並不算理解HTTP協議,HTTP協議中還有非常多好玩又好用的內容等著大家去發掘。

作者:Jokcy

鏈接:imooc.com/article/31682

來源:慕課網


推薦閱讀:

【重磅】認證作者招募 | 打造個人品牌 so easy !

有獎徵文004期|從小白到大牛,進階路上有話說?

阿里雲ECS和Centos7實戰-「與雲共舞,新成大海」

想開發Angular項目,但是沒有開發環境?使用Docker So Easy!

微信小程序多層展開/收起列表

推薦閱讀:

怎樣把 ssh、http 和 https 放到同一埠?
基於傳輸層TCP、UDP協議的自定義應用層協議如何實現?
如何使用Nginx轉發非80埠的非HTTP請求?
web性能優化之:no-cache與must-revalidate深入探究
Akka HTTP 文檔 (非官方漢化)- 導讀

TAG:緩存 | HTTP | 前端開發 |