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