Http 緩存機(jī)制作為 web 性能優(yōu)化的重要手段,有如下作用:
- 減少網(wǎng)絡(luò)帶寬消耗:無論對于網(wǎng)站運(yùn)營者或者用戶迁霎,帶寬都代表著金錢吱抚,過多的帶寬消耗,只會便宜了網(wǎng)絡(luò)運(yùn)營商考廉。當(dāng)Web緩存副本被使用時秘豹,只會產(chǎn)生極小的網(wǎng)絡(luò)流量,可以有效的降低運(yùn)營成本昌粤。
- 降低服務(wù)器壓力:給網(wǎng)絡(luò)資源設(shè)定有效期之后既绕,用戶可以重復(fù)使用本地的緩存,減少對源服務(wù)器的請求涮坐,間接降低服務(wù)器的壓力凄贩。同時,搜索引擎的爬蟲也能根據(jù)過期機(jī)制降低爬取的頻率袱讹,也能有效降低服務(wù)器的壓力疲扎。
- 減少網(wǎng)絡(luò)延遲评肆,加快頁面打開速度:帶寬對于個人網(wǎng)站運(yùn)營者來說是十分重要,而對于大型的互聯(lián)網(wǎng)公司來說瓜挽,可能有時因?yàn)殄X多而真的不在乎。那Web緩存還有作用嗎久橙?答案是肯定的,對于最終用戶缸榄,緩存的使用能夠明顯加快頁面打開速度祝拯,達(dá)到更好的體驗(yàn)。
以下是對HTTP中控制客戶端緩存的幾種方式以及優(yōu)先級的梳理
強(qiáng)制緩存
瀏覽器在請求已經(jīng)訪問過的URL的時候, 會判斷是否使用緩存, 判斷是否使用緩存主要通過判斷緩存是否在有效期內(nèi), 通過兩個字段來判斷:
- Expires, 有效期, 返回的是一個GMT時間鹰贵,這是一個絕對時間, 但是使用的是客戶端時間, 與服務(wù)器時間存在一定時間差
- Cache-Control => max-age, 最大有效時間,這是一個相對時間, 單位是s, 優(yōu)先級比expires高, 為了解決expires時間差的問題而出現(xiàn)的
對比緩存
當(dāng)緩存過期后, 瀏覽器不會直接去服務(wù)器上拿緩存, 而是判斷緩存是否有更新, 能否繼續(xù)使用, 判斷的方法有兩種:
- Last-Modified 和 If-Modified-Since: 服務(wù)器會響應(yīng)一個Last-Modified字段, 表示最近一次修改緩存的時間, 當(dāng)緩存過期后, 瀏覽器就會把這個時間放在If-Modified-Since去請求服務(wù)器, 判斷緩存是否有更新
- Etag和If-None-Match: 服務(wù)器會響應(yīng)一個Etag字段, 一個表示文件唯一的標(biāo)識符, 一旦文件更新, Etag也會跟著更改, 當(dāng)緩存過期后, 瀏覽器會把這個唯一標(biāo)識符放在If-None-Match去請求服務(wù)器, 判斷是否有更新, Etag的優(yōu)先級比Last-Modified的更高
那么既生Last-Modified何生Etag碉输?你可能會覺得使用Last-Modified已經(jīng)足以讓瀏覽器知道本地的緩存副本是否足夠新亭珍,為什么還需要Etag(實(shí)體標(biāo)識)呢?HTTP1.1中Etag的出現(xiàn)主要是為了解決幾個Last-Modified比較難解決的問題
- Last-Modified標(biāo)注的最后修改只能精確到秒級阻荒,如果某些文件在1秒鐘以內(nèi)峭范,被修改多次的話,它將不能準(zhǔn)確標(biāo)注文件的修改時間
- 如果某些文件會被定期生成纱控,當(dāng)有時內(nèi)容并沒有任何變化,但Last-Modified卻改變了舶掖,導(dǎo)致文件沒法使用緩存
- 有可能存在服務(wù)器沒有準(zhǔn)確獲取文件修改時間尔店,或者與代理服務(wù)器時間不一致等情形