目錄
HTTP緩存技術有哪些?
什么是強制緩存?
什么是協商緩存?
HTTP緩存技術有哪些?
對于一些具有重復性的HTTP請求,比如每次請求得到的數據都是一樣的,我們可以把這對 請求-響應的數據都緩存在本地,那么下次就直接讀取本地數據,不必通過網絡獲取服務器響應的數據了,這樣對于http1.1的性能是明顯的提升。
對于http緩存有兩種實現方式,分別是強制緩存和協商緩存。
什么是強制緩存?
強制緩存:指的是只要瀏覽器判斷緩存沒有過期,直接使用瀏覽器的緩存,決定是否使用緩存的主動性在瀏覽器這邊
強緩存是利用下面這兩個http響應頭部(Response Header)字段實現的,都用來表示資源在客戶端的有效期:
Cache-Control,是一個相對時間;
Expires,是一個絕對時間;
Cache-Control和Expires字段同時存在的化,Cache-Control的優先級更高于Expires。
Cache-Control實現強制緩存。具體流程如下:
- 當瀏覽器第一次請求訪問服務器資源時,服務器會在這返回這個資源的同時,在Response頭部加上Cache-control,Cache-Control中這是了過期時間大小;
- 瀏覽器再次請求訪問服務器中的該資源時,會想通過請求資源的時間與Cache-Control中的過期時間大小,來計算該資源是否過期,如果沒有,則使用該緩存,否則重新請求服務器;
- 服務器再次收到請求后,會再次更新Response頭部的Cache-Control。
什么是協商緩存?
當我們在瀏覽器使用開發者工具的時候,你可能會看到過某些請求的響應碼是304,這個是告訴瀏覽器可以使用本地緩存的資源,通常這種通過服務端告知客戶端可以使用緩存的方式被稱為協商緩存。
協商緩存可以基于兩種頭部來實現。
第一種:請求頭部中的If-Modified-since字段與響應頭部中的Last-Modified字段實現,這兩個字段的意思是:
- 響應頭部中的Last-Modified:表示這個響應資源的最后修改時間;
- 請求頭部中的If-Modified-Since:當資源過期了,發現響應頭中具有Last-Modified聲明,則再次發起請求的時候帶上Last-Modified的時間,服務器收到請求后發現有If-Modified-Since則與被請求資源的最后修改時間進行對比(Last-Modified),如果最后修改時間比較新,說明資源又被修改過,則返回最新資源,HTTP 200 OK;如果最后修改時間比較舊,說明資源無新修改,響應HTTP 304走緩存。
第二種:頭部中的if-None-Match字段與響應頭部中的ETag字段,這兩個字段的意思是:
- 響應頭部中Etag:唯一標識響應資源;
- 請求頭部中的If-None-match:當資源過期時,瀏覽器發現響應頭里有Etag,則再次向服務器發起請求時,會將請求頭If-None-Match值設置為Etag的值。服務器收到請求后進行比對,如果資源沒有變化返回304,如果資源變化了返回200。
第一種實現方式是基于時間實現的,第二種實現方式是基于一個唯一標識實現的,相對來說后者可以更加準確的判斷文件內容是否被修改,避免由于時間篡改導致的不可靠問題。
如果在第一次請求資源的時候,服務端返回的HTTP響應頭部同時有Etag和last-Modified字段,那么客戶端在下一次請i去的時候如果帶上了Etag和Last-Modified字段信息給服務端,這時Etag的優先級更高,也就是服務端會先判斷Etag是否變化了,如果Etag有變化就不用在判斷Last-Modified,如果Etag沒有變化,然后再看last-Modified。
Etag優先級高于Last-Modified的原因:
因為在沒有修改文件內容情況下的最后修改時間也可能發生改變,這導致客戶端認為文件被改動了從新發起請求;
有些文件修改在毫秒級內,if-since-Since能檢查到的粒度是秒級的,
而且協商緩存這兩個字段都需要配合強制緩存中的Cache-Control字段來使用,只有在未能命中強制緩存的時候,才能發起帶有協商緩存字段的請求。