緩存可以減少冗余的數(shù)據(jù)傳輸。節(jié)省了網(wǎng)絡(luò)帶寬,從而更快的加載頁面。
緩存降低了服務(wù)器的要求,從而服務(wù)器更快的響應(yīng)。
那么我們使用緩存,緩存的資源文件到什么地方去了呢?首先來看下有哪幾種緩存類型呢?
1.memory cache: 它是將資源文件緩存到內(nèi)存中。等下次請求訪問的時候不需要重新下載資源,而是直接從內(nèi)存中讀取數(shù)據(jù)。
2.disk cache: 它是將資源文件緩存到硬盤中。等下次請求的時候它是直接從硬盤中讀取。
那么他們兩則的區(qū)別是?
3.memory cache(內(nèi)存緩存)退出進(jìn)程時數(shù)據(jù)會被清除,而disk cache(硬盤緩存)退出進(jìn)程時數(shù)據(jù)不會被清除。內(nèi)存讀取比硬盤中讀取的速度更快。但是我們也不能把所有數(shù)據(jù)放在內(nèi)存中緩存的,因為內(nèi)存也是有限的。
memory cache(內(nèi)存緩存)一般會將腳本、字體、圖片會存儲到內(nèi)存緩存中。
4.disk cache(硬盤緩存) 一般非腳本會存放在硬盤中,比如css這些。
緩存讀取的原理:先從內(nèi)存中查找對應(yīng)的緩存,如果內(nèi)存中能找到就讀取對應(yīng)的緩存,否則的話就從硬盤中查找對應(yīng)的緩存,如果有就讀取,否則的話,就重新網(wǎng)絡(luò)請求。
那么瀏覽器緩存它又分為2種: 強(qiáng)制緩存 和 協(xié)商緩存 。
協(xié)商緩存原理:客戶端向服務(wù)器端發(fā)出請求,服務(wù)端會檢測是否有對應(yīng)的標(biāo)識,如果沒有對應(yīng)的標(biāo)識,服務(wù)器端會返回一個對應(yīng)的標(biāo)識給客戶端,客戶端下次再次請求的時候,把該標(biāo)識帶過去,然后服務(wù)器端會驗證該標(biāo)識,如果驗證通過了,則會響應(yīng)304,告訴瀏覽器讀取緩存。如果標(biāo)識沒有通過,則返回請求的資源。
那么協(xié)商緩存的標(biāo)識又有2種:ETag/if-None-Match 和 Last-Modified/if-Modify-Since
Last-Modified/if-Modify-Since緩存
瀏覽器第一次發(fā)出請求一個資源的時候,服務(wù)器會返回一個last-Modify到hearer中. Last-Modify 含義是最后的修改時間。
當(dāng)瀏覽器再次請求的時候,request的請求頭會加上 if-Modify-Since,該值為緩存之前返回的 Last-Modify. 服務(wù)器收到if-Modify-Since后,根據(jù)資源的最后修改時間(last-Modify)和該值(if-Modify-Since)進(jìn)行比較,如果相等的話,則命中緩存,返回304,否則, 如果 Last-Modify > if-Modify-Since, 則會給出200響應(yīng),并且更新Last-Modify為新的值。
ETag/if-None-Match緩存
ETag的原理和上面的last-modified是類似的。ETag則是對當(dāng)前請求的資源做一個唯一的標(biāo)識。該標(biāo)識可以是一個字符串,文件的size,hash等。只要能夠合理標(biāo)識資源的唯一性并能驗證是否修改過就可以了。ETag在服務(wù)器響應(yīng)請求的時候,返回當(dāng)前資源的唯一標(biāo)識(它是由服務(wù)器生成的)。但是只要資源有變化,ETag會重新生成的。瀏覽器再下一次加載的時候會向服務(wù)器發(fā)送請求,會將上一次返回的ETag值放到request header 里的 if-None-Match里面去,服務(wù)器端只要比較客戶端傳來的if-None-Match值是否和自己服務(wù)器上的ETag是否一致,如果一致說明資源未修改過,因此返回304,如果不一致,說明修改過,因此返回200。并且把新的Etag賦值給if-None-Match來更新該值。
last-modified 和 ETag之間對比
在精度上,ETag要優(yōu)先于 last-modified。
在性能上,Etag要遜于Last-Modified,Last-Modified需要記錄時間,而Etag需要服務(wù)器通過算法來計算出一個hash值。
在優(yōu)先級上,服務(wù)器校驗優(yōu)先考慮Etag。
如上我們可以看到返回值里面有Etag的值。
然后當(dāng)我們再次刷新瀏覽器代碼的時候,瀏覽器將會帶上 if-None-Match請求頭,并賦值為上一次返回頭的Etag的值。然后和服務(wù)器端的Etag的值進(jìn)行對比,如果相等的話,就會返回304 Not Modified。如下圖所示:
我們再來改下html的內(nèi)容,我們再來刷新下看看,可以看到頁面內(nèi)容發(fā)生改變了,因此Etag值是不一樣的。如下圖所示
然后我們繼續(xù)刷新,就會返回304了,因為它會把最新的Etag的值賦值給 if-None-Match請求頭,然后請求的時候,會把該最新值帶過去,因此如下圖所示可以看到。
強(qiáng)制緩存
基本原理:瀏覽器在加載資源的時候,會先根據(jù)本地緩存資源的header中的信息(Expires 和 Cache-Control)來判斷是否需要強(qiáng)制緩存。如果命中的話,則會直接使用緩存中的資源。否則的話,會繼續(xù)向服務(wù)器發(fā)送請求。
Expires 是http1.0的規(guī)范,它的值是一個絕對時間的GMT格式的時間字符串。這個時間代表的該資源的失效時間,如果在該時間之前請求的話,則都是從緩存里面讀取的。但是使用該規(guī)范時,可能會有一個缺點就是當(dāng)服務(wù)器的時間和客戶端的時間不一樣的情況下,會導(dǎo)致緩存失效。
Cache-Control
Cache-Control 是http1.1的規(guī)范,它是利用該字段max-age值進(jìn)行判斷的。該值是一個相對時間,比如 Cache-Control: max-age=3600, 代表該資源的有效期是3600秒。除了該字段外,我們還有如下字段可以設(shè)置:
no-cache: 需要進(jìn)行協(xié)商緩存,發(fā)送請求到服務(wù)器確認(rèn)是否使用緩存。
no-store:禁止使用緩存,每一次都要重新請求數(shù)據(jù)。
public:可以被所有的用戶緩存,包括終端用戶和 CDN 等中間代理服務(wù)器。
private:只能被終端用戶的瀏覽器緩存,不允許 CDN 等中繼緩存服務(wù)器對其緩存。
Cache-Control 與 Expires 可以在服務(wù)端配置同時啟用,同時啟用的時候 Cache-Control 優(yōu)先級高。
Nginx緩存的類型
1.客戶端的緩存(一般指瀏覽器的緩存)。
2.服務(wù)端的緩存(使用proxy-cache實現(xiàn)的)。
Nginx如何配置
知道Nginx虛擬機(jī)的配置文件,示例如下圖:
server {
server_name www.qqdeveloper.com
location ~* \.(html)$ {
access_log off;
add_header Cache-Control max-age=no-cache;
}
location ~* \.(css|js|png|jpg|jpeg|gif|gz|svg|mp4|ogg|ogv|webm|htc|xml|woff)$ {
access_log off;
add_header Cache-Control max-age=360000;
}
}
~ 的含義是:通配任意字符(且大小寫不敏感),\轉(zhuǎn)義字符,因此 ~ .(html)$的含義是:匹配所有以.html結(jié)尾的請求
access_log off; 的含義是 關(guān)閉日志功能。
add_header Cache-Control max-age=no-cache; 的含義:html文件不設(shè)置強(qiáng)制緩存時間,協(xié)商緩存,使用 Last-Modified。no-cache 會發(fā)起往返通信來驗證緩存的響應(yīng),但如果資源未發(fā)生變化,則不會下載,返回304。
如下圖
add_header Cache-Control max-age=360000; 的含義給上面匹配后綴的文件設(shè)置強(qiáng)制緩存,且緩存的時間是360000秒,第一次訪問的時候,從服務(wù)器請求,當(dāng)除了第一次以外,再次刷新瀏覽器,會從瀏覽器緩存讀取,那么強(qiáng)制緩存一般是從內(nèi)存里面先讀取,如果內(nèi)存沒有,再從硬盤讀取。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。