HTTP緩存的應用,不僅僅是max-age
來自專欄猿論
相信不管是做前端開發還是後端開發的同學,或多或少在開發過程中接觸過緩存的概念。最簡單的例子就是前端對於靜態資源--即css、js、圖片等文件資源進行緩存。但是大部分同學知道的可能就是設置
Cache-Control: max-age=xxx
來設置資源的過期時間,然而緩存的運用在互聯網中可謂是無處不在,一個好的緩存方案可以大大提升服務的性能,而一個不好的緩存方案可能會導致網站的可用性降低。所以今天我們就來聊聊HTTP協議中的緩存。
首先HTTP協議中主要涉及緩存的Header就是Cache-Control
和Expires
,目前階段來說Expires
已經漸漸被淘汰了,所以我們主要講講Cache-Control
。
Cache-Control
並不是只有指定max-age
過期時間這麼一種使用方式,事實上這只是Cache-Control
最基礎的用法,我們來看看Cache-Control
有哪些可以設置的值
- private、public和no-cache用來指定客戶端和代理緩存的可緩存性
- max-age和s-maxage用來指定客戶端和代理緩存的緩存時間
- must-revalidate和proxy-revalidate用來指定緩存過期後是否必須驗證才能使用
- no-store用來表明任何地方都不應該緩存內容
- 其他一些不常用的設置
首先大家必須要弄清楚的一點是,緩存不僅僅只有瀏覽器可以緩存,互聯網中存在著各式各樣的代理緩存。HTTP僅僅是一個應用層的協議,在數據傳輸的過程中逃不開各種中繼的設備,而本身HTTP是明文傳輸的,所以每個中繼設備都可以解析HTTP數據包中的內容,所以如果某個中繼設備想,他就可以成為一個代理緩存(想想曾經的某些運行商做的事)。當然HTTP的代理緩存更多還是服務假設者自己做的,但是本質上是一個意思。
那麼相對於大家都知道的客戶端緩存,代理緩存有什麼好處呢?最明顯的優勢就是:客戶端緩存是一對一的,但是代理緩存是一對多的。
從這張圖中我們可以看到,對於同一個源伺服器可以存在不同的代理(有些CDN就近獲取資源就有用到緩存的知識)。如果這些代理都開啟來緩存功能,那麼用戶一在第一次訪問數據的時候,代理通過源伺服器獲取資源返回給用戶,並同時緩存來這個請求,這時候用戶二再次來請求的時候,就不需要經過源伺服器,直接從代理緩存讀取就可以來。
所以對於耗時操作而且數據修改不頻繁的數據,開啟代理緩存對於性能的提升是非常明顯的,哪怕你每次緩存的時間只有5秒,對於並發量很高請求帶來的性能提升也是不可估量的。
當然這個操作源伺服器通過自己設置緩存也可以實現,但是代理緩存的好處是,如果你的代理離用戶足夠近,那麼減少的延時也是非常明顯的。比如如果你的伺服器在美國紐約,如果你不在國內設置一個代理緩存,那麼所有數據都要跨國半個地球再繞回來,而有代理緩存的情況就不一樣來。
那麼說回來,怎麼控制代理緩存的使用?還是靠HTTP協議,在HTTP協議的發展歷史中,已經有非常多的實踐讓協議進行修改和發展,所以目前的緩存方案可以說已經比較完善了。一般來說,代理緩存伺服器都會對最新的HTTP協議的標準進行實現,並且適當兼容老得標準,一般不會出現一些魔改實現。所以只要你對HTTP協議的緩存方案充分了解,那麼你就可以很好得使用代理伺服器的緩存了。
最主要的你需要知道:
- 如何控制代理服務是否緩存或者緩存多少時間
- 代理緩存時候可以提供過期緩存的內容
- 如何進行緩存驗證
知道這些之後,配合一個好用的代理緩存,相信能對你的服務帶來很大的性能提升。以上的內容並不是特別好理解,如果大家有興趣可以去看一下我的新課HTTP協議原理+實踐 Web開發工程師必學,裡面對HTTP協議的原理,不同HEADER的作用和實踐、Nginx部署代理和緩存、HTTPS、HTTP2都有使用例展示進行深入的講解。
最後,HTTP協議是所有WEB相關開發的同學都必須要牢牢掌握的基礎,僅僅知道POST、GET、Content-Type並不算理解HTTP協議,HTTP協議中還有非常多好玩又好用的內容等著大家去發掘。
作者:Jokcy
鏈接:https://www.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 文檔 (非官方漢化)- 導讀