摘要:整個(gè)請(qǐng)求響應(yīng)鏈的緩存機(jī)制必須遵循的特別指令?;镜木彺鏅C(jī)制就是由這些參數(shù)形成的。如果此文章中有什么問(wèn)題的話,煩請(qǐng)一定要指出,謝謝參考資料緩存機(jī)制淺析移動(dòng)端加載性能優(yōu)化淺談瀏覽器的緩存機(jī)制
之前對(duì)http的緩存知識(shí)一知半解,只能說(shuō)出個(gè)大概。和同事交流這塊內(nèi)容時(shí)稍一深入探討就捉襟見肘,自慚形穢。故痛定思痛,花了一兩天時(shí)間去研究了下這塊內(nèi)容,寫下這篇筆記方便以后的查詢與修正。
首先介紹下和緩存相關(guān)的http頭字段參數(shù)。http的頭字段包括通用頭字段(general-header)、請(qǐng)求頭字段(request-header)、響應(yīng)頭字段(response-header)以及實(shí)體頭字段(entity-header)。
我個(gè)人對(duì)實(shí)體頭字段這個(gè)說(shuō)法有點(diǎn)陌生,所以查閱了相關(guān)資料:根據(jù)RFC-2616(7.1 Entity Header Fields)中的解釋是:實(shí)體頭字段(entity header)定義了實(shí)體主體(entity-body)的元信息,如果實(shí)體主體(entity-body)不存在,則表示http請(qǐng)求所標(biāo)識(shí)的資源的元信息。
general headerEntity-header fields define metainformation about the entity-body or,
if no body is present, about the resource identified by the request.
Cache-Control: 整個(gè)請(qǐng)求響應(yīng)鏈的緩存機(jī)制必須遵循的特別指令。這個(gè)指令是單向的,因?yàn)檎?qǐng)求中該指令的效果和響應(yīng)中的效果并不一樣。其值包括max-age,no-cache等。
The Cache-Control general-header field is used to specify directives that MUST be obeyed by all caching mechanisms along the request/response chain.
Cache directives are unidirectional in that the presence of a directive in a request does not imply that the same directive is to be given in the response.
Date: 請(qǐng)求或響應(yīng)的時(shí)間和日期。(注:這里的日期格式使用的是GMT格式,即格林威治時(shí)間,要換算成北京時(shí)間的話要加上8小時(shí))
Pragma:可被應(yīng)用到整個(gè)請(qǐng)求響應(yīng)鏈中的自定義設(shè)置,例如:Pragma: no-cache。
request headerThe Pragma general-header field is used to include implementation-specific directives that might apply to any recipient along the request/response chain.
If-Modified-Since: 如果從該參數(shù)指定的時(shí)間開始,請(qǐng)求并沒(méi)有被修改的話,服務(wù)器會(huì)返回304(not modified)狀態(tài)碼,而不是一個(gè)實(shí)體。
if the requested variant has not been modified since the time specified in this field, an entity will not be returned from the server; instead, a 304 (not modified) response will be returned without any message-body.
If-Unmodified-Since: 如果從該參數(shù)指定的時(shí)間開始,請(qǐng)求并沒(méi)有被修改的話,服務(wù)器應(yīng)該執(zhí)行請(qǐng)求的操作。如果被修改過(guò)的話,服務(wù)器不執(zhí)行操作病返回412(Precondition Failed)狀態(tài)碼
If the requested resource has not been modified since the time specified in this field, the server SHOULD perform the requested operation as if the If-Unmodified-Since header were not present.
If the requested variant has been modified since the specified time, the server MUST NOT perform the requested operation, and MUST return a 412 (Precondition Failed).
If-None-Match: 允許在對(duì)應(yīng)的內(nèi)容未被修改的情況下返回304未修改( 304 Not Modified ),判斷依據(jù)為客戶端該參數(shù)存儲(chǔ)的Etag值與服務(wù)器上存儲(chǔ)的Etag是否相匹配。(原文太長(zhǎng),暫時(shí)拿wiki百科來(lái)填坑)
If-Match: 僅當(dāng)客戶端提供的實(shí)體與服務(wù)器上對(duì)應(yīng)的實(shí)體相匹配時(shí),才進(jìn)行對(duì)應(yīng)的操作。主要用作像 PUT 這樣的方法中,僅當(dāng)從用戶上次更新某個(gè)資源以來(lái),該資源未被修改的情況下,才更新該資源。如果不匹配,則返回412(Precondition Failed)狀態(tài)碼,該參數(shù)也會(huì)被忽略。(原文太長(zhǎng),暫時(shí)拿wiki百科來(lái)填坑)
response headerETag: 指定請(qǐng)求變量的當(dāng)前實(shí)體Tag。該字段用來(lái)比較來(lái)自同一資源的變化的實(shí)體。(只是直譯,后面會(huì)有詳細(xì)解釋和用法)
Entity HeaderThe ETag response-header field provides the current value of the entity tag for the requested variant.
Expires: 指定過(guò)期時(shí)間。
The Expires entity-header field gives the date/time after which the response is considered stale.
Last-Modified: 指定了服務(wù)器認(rèn)為資源最近一次修改的時(shí)間。
The Last-Modified entity-header field indicates the date and time at which the origin server believes the variant was last modified.
字段參數(shù)可能會(huì)有翻譯或者理解錯(cuò)誤,請(qǐng)各位大大指出。
了解了參數(shù)的含義后,接下來(lái)就是看具體的緩存機(jī)制了。
HTTP 1.0時(shí)代 (基于Pragma&Expires的緩存實(shí)現(xiàn))Pragma在RFC1945文檔中只提供了“no-cache”值,當(dāng)"no-cache"出現(xiàn)在請(qǐng)求消息中時(shí),應(yīng)用程序應(yīng)當(dāng)向原始服務(wù)器推送此請(qǐng)求,即使它已經(jīng)在上次請(qǐng)求時(shí)已經(jīng)緩存了一份拷貝。這樣將保證客戶端能接收到最權(quán)威的回應(yīng)。它也用來(lái)在客戶端發(fā)現(xiàn)其緩存中拷貝不可用或過(guò)期時(shí),對(duì)拷貝進(jìn)行強(qiáng)制刷新。
(HTTP1.1會(huì)把請(qǐng)求中的pragma="no-cache"視為發(fā)送了Cache-Control: no-cache)
有Pragma用來(lái)禁用緩存的話,那就有Expires來(lái)設(shè)置緩存。
就如上文介紹所說(shuō),Expires是用來(lái)指定過(guò)期時(shí)間的,時(shí)間格式為GMT,如果客戶端時(shí)間沒(méi)有超過(guò)該時(shí)間點(diǎn)的話,則不發(fā)送請(qǐng)求。但是值得注意的是,Expires所定義的緩存時(shí)間是相對(duì)服務(wù)器上的時(shí)間而言的,如果客戶端的時(shí)間和服務(wù)器的時(shí)間不一致的話(例如用戶修改了系統(tǒng)時(shí)間),那么這個(gè)資源失效時(shí)間也沒(méi)有意義了。
http1.1新增了 Cache-Control 來(lái)定義緩存過(guò)期時(shí)間,若報(bào)文中同時(shí)出現(xiàn)了Expires 和 Cache-Control,會(huì)以 Cache-Control 為準(zhǔn)。
如上文介紹所說(shuō),Cache-Control是通用頭部參數(shù),格式為
"Cache-Control" ":" cache-directive
作為請(qǐng)求頭部時(shí),cache-directive的可選值為:(圖片來(lái)自網(wǎng)絡(luò))
作為響應(yīng)頭部時(shí),cache-directive的可選值為:(圖片來(lái)自網(wǎng)絡(luò))
cache-control設(shè)置緩存的使用方法為:Cache-Control:max-age=31536000,緩存單位為秒。
如果客戶端請(qǐng)求的資源未超過(guò)緩存時(shí)間,則直接取本地緩存,狀態(tài)碼為200(from memory cache),
但是如果超過(guò)緩存時(shí)間或者直接不走緩存的話,那我們就需要和其他的字段配合來(lái)校驗(yàn)緩存了。
服務(wù)端傳遞資源給客戶端的時(shí)候會(huì)在響應(yīng)報(bào)文中帶上這個(gè)信息,而客戶端接受到資源后會(huì)將該信息的值設(shè)置為請(qǐng)求頭中If-Modified-Since參數(shù)的值(If-Modified-Since: Last-Modified value)。在下次發(fā)送請(qǐng)求的時(shí)候(max-age過(guò)期之后),會(huì)將請(qǐng)求頭中的If-Modified-Since參數(shù)的值與服務(wù)端Last-Modified的值去比較,如果仍是一致的,那么說(shuō)明該資源未被修改,直接返回304狀態(tài)碼即可,如果不一致,則返回狀態(tài)碼200,以及新的Last-Modified。
但是Last-Modified會(huì)有不準(zhǔn)確的時(shí)候,比如服務(wù)端的資源做了無(wú)實(shí)際變化的修改(加一個(gè)空格再刪掉),這樣也會(huì)使服務(wù)端Last-Modified的時(shí)間更新,導(dǎo)致客戶端請(qǐng)求中If-Modified-Since的值與其無(wú)法匹配,就會(huì)返回整個(gè)實(shí)體。(即使返回的實(shí)體內(nèi)容與客戶端的緩存內(nèi)容沒(méi)有區(qū)別)
2. EtagEtag是一種比Last-Modified更為精確的校驗(yàn)方式。服務(wù)器會(huì)通過(guò)某種算法,給資源計(jì)算得出一個(gè)唯一標(biāo)志符。其判斷依據(jù)和Last-Modified類似,只是服務(wù)端在傳遞資源給客戶端的相應(yīng)報(bào)文中帶上Etag后,客戶端會(huì)將其設(shè)置為請(qǐng)求頭中If-None-Match參數(shù)的值(If-None-Match: Etag-value),然后在傳遞資源時(shí)進(jìn)行比較。
如果同時(shí)使用Last-Modified和Etag進(jìn)行驗(yàn)證的話,那么兩者中有一個(gè)通過(guò)校驗(yàn)(即傳遞的值可以匹配),則可以認(rèn)為資源并沒(méi)有被修改。
基本的緩存機(jī)制就是由這些參數(shù)形成的。
最后我們來(lái)看下,不同的頁(yè)面打開方式對(duì)緩存機(jī)制的影響
主要有以下兩點(diǎn)要注意:
1.手動(dòng)刷新頁(yè)面(F5刷新),瀏覽器會(huì)直接認(rèn)為緩存已經(jīng)過(guò)期,即使緩存并沒(méi)有過(guò)期,在請(qǐng)求中加上字段:Cache-Control:max-age=0,發(fā)包向服務(wù)器查詢是否有文件是否有更新。
2.強(qiáng)制刷新頁(yè)面(ctrl+F5刷新),瀏覽器會(huì)直接忽略本地緩存內(nèi)容,即使本地有緩存可用,在請(qǐng)求中加上字段:Cache-Control:no-cache(或 Pragma:no-cache),發(fā)包向服務(wù)器重新請(qǐng)求文件。
其他的直接上圖(圖片來(lái)自網(wǎng)絡(luò)):
此篇文章的很多想法是借鑒網(wǎng)上高手的文章,我會(huì)在底部標(biāo)明參考出處。如果此文章中有什么問(wèn)題的話,煩請(qǐng)一定要指出,謝謝!
參考資料
RFC2616
H5 緩存機(jī)制淺析 移動(dòng)端 Web 加載性能優(yōu)化
淺談瀏覽器http的緩存機(jī)制
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/61822.html
摘要:性能優(yōu)化如何進(jìn)行網(wǎng)站性能優(yōu)化方面減少請(qǐng)求合并文件精靈減少查詢查詢完成之前瀏覽器不能從這個(gè)主機(jī)下載任何任何文件。 性能優(yōu)化 如何進(jìn)行網(wǎng)站性能優(yōu)化 content方面 減少HTTP請(qǐng)求:合并文件、CSS精靈、inline Image 減少DNS查詢:DNS查詢完成之前瀏覽器不能從這個(gè)主機(jī)下載任何任何文件。方法:DNS緩存、將資源分布到恰當(dāng)數(shù)量的主機(jī)名,平衡并行下載和DNS查詢 避免...
摘要:淺談網(wǎng)站性能之前端性能優(yōu)化性能優(yōu)化的目的無(wú)非是減少用戶流量消耗,提升用戶首屏體驗(yàn),提升用戶訪問(wèn)速度,讓用戶專注內(nèi)容本身。前端性能優(yōu)化減少請(qǐng)求數(shù)量基本原理在瀏覽器與服務(wù)器進(jìn)行通信時(shí),主要是通過(guò)進(jìn)行通信。 最近項(xiàng)目慢慢走上正軌,需求趨于平穩(wěn),這才想起需要對(duì)整站進(jìn)行性能優(yōu)化。經(jīng)過(guò)一段時(shí)間的學(xué)習(xí),結(jié)合現(xiàn)在項(xiàng)目的實(shí)際性能情況,發(fā)現(xiàn)確實(shí)有許多地方可以進(jìn)行優(yōu)化。于是就開始了我的前端性能優(yōu)化之旅。以下...
摘要:淺談網(wǎng)站性能之前端性能優(yōu)化性能優(yōu)化的目的無(wú)非是減少用戶流量消耗,提升用戶首屏體驗(yàn),提升用戶訪問(wèn)速度,讓用戶專注內(nèi)容本身。前端性能優(yōu)化減少請(qǐng)求數(shù)量基本原理在瀏覽器與服務(wù)器進(jìn)行通信時(shí),主要是通過(guò)進(jìn)行通信。 最近項(xiàng)目慢慢走上正軌,需求趨于平穩(wěn),這才想起需要對(duì)整站進(jìn)行性能優(yōu)化。經(jīng)過(guò)一段時(shí)間的學(xué)習(xí),結(jié)合現(xiàn)在項(xiàng)目的實(shí)際性能情況,發(fā)現(xiàn)確實(shí)有許多地方可以進(jìn)行優(yōu)化。于是就開始了我的前端性能優(yōu)化之旅。以下...
摘要:例如,將獲得最高優(yōu)先級(jí),而將獲得低優(yōu)先級(jí)或中優(yōu)先級(jí)。不帶屬性的的優(yōu)先級(jí)將會(huì)等同于異步請(qǐng)求。對(duì)使用屬性,不然將不會(huì)從中獲益。因此,在標(biāo)記中聲明以被掃描器掃描。 這是 Web 性能優(yōu)化的第 6 篇,上一篇在下面看點(diǎn)擊查看: Web 性能優(yōu)化:使用 Webpack 分離數(shù)據(jù)的正確方法 Web 性能優(yōu)化:圖片優(yōu)化讓網(wǎng)站大小減少 62% Web 性能優(yōu)化:緩存 React 事件來(lái)提高性能 We...
打算現(xiàn)在開始在博客里寫點(diǎn)東西,也能為自己看過(guò)的書學(xué)過(guò)的知識(shí)做一個(gè)歸納總結(jié)。這幾日拜讀了Steve Souders的《高性能網(wǎng)站建設(shè)指南這本書》,雖然這本書可能已經(jīng)有些老了,但薄薄的一個(gè)小冊(cè)子里提出的網(wǎng)站性能優(yōu)化的準(zhǔn)則還是非常有價(jià)值的。這些規(guī)則都有個(gè)共同點(diǎn),就是用很小的工作就能獲得很明顯的性能提升,性價(jià)比極高。廢話不多說(shuō)了,總結(jié)一下書里的幾點(diǎn)性能優(yōu)化規(guī)則。 首先有一點(diǎn)需要說(shuō)明的是書中所寫的性能黃金法...
閱讀 1005·2021-09-09 09:32
閱讀 3016·2021-09-02 10:20
閱讀 2828·2021-07-23 11:24
閱讀 899·2019-08-30 15:54
閱讀 3723·2019-08-30 15:54
閱讀 1415·2019-08-30 11:02
閱讀 2911·2019-08-26 17:40
閱讀 1190·2019-08-26 13:55