利用HTTP協(xié)議和瀏覽器緩存,減少數(shù)據(jù)讀取時(shí)間

一般減少數(shù)據(jù)讀取時(shí)間方法

1.合理建立關(guān)系型數(shù)據(jù)庫(kù)索引

2.合理利用NOSQL數(shù)據(jù)庫(kù)(如redis)存儲(chǔ)數(shù)據(jù),可以做到隨機(jī)讀取

3.利用緩存機(jī)制,把查詢速度慢或者計(jì)算量比較大的結(jié)果集存儲(chǔ)起來(lái),并適當(dāng)設(shè)置過期時(shí)間

4.優(yōu)化SQL語(yǔ)句

其他方法,說(shuō)明一下

眾所周知,大多數(shù)瀏覽器客戶端,為了減少網(wǎng)絡(luò)延時(shí),會(huì)利用本地緩存來(lái)加快二次加載的速度

緩存的對(duì)象一般有:媒體文件(jpg,gif等),樣式文件,腳本文件等。

腳本文件運(yùn)行所產(chǎn)生的文本其實(shí)也可以算是普通文本,那么對(duì)于實(shí)時(shí)性要求低的數(shù)據(jù)請(qǐng)求,我們絕對(duì)可以利用瀏覽器緩存來(lái)幫我們解決問題。

利用ETag響應(yīng)頭,返回304(not modified)

下面說(shuō)明一下ETag的機(jī)制

====第一次請(qǐng)求===

1.客戶端發(fā)起 HTTP GET 請(qǐng)求一個(gè)文件;

2.服務(wù)器處理請(qǐng)求,返回文件內(nèi)容和一堆Header,當(dāng)然包括Etag(例如"2e681a-6-5d044840")(假設(shè)服務(wù)器支持Etag生成和已經(jīng)開啟了Etag).狀態(tài)碼200

====第二次請(qǐng)求===

1.客戶端發(fā)起 HTTP GET 請(qǐng)求一個(gè)文件,注意這個(gè)時(shí)候客戶端同時(shí)發(fā)送一個(gè)If-None-Match頭,這個(gè)頭的內(nèi)容就是第一次請(qǐng)求時(shí)服務(wù)器返回的Etag:2e681a-6-5d044840

2.服務(wù)器判斷發(fā)送過來(lái)的Etag和計(jì)算出來(lái)的Etag匹配,因此If-None-Match為False,不返回200,返回304,客戶端繼續(xù)使本地緩存;


利用Modified-Since響應(yīng)頭,返回304(not modified)

下面說(shuō)明一下Modified-Since的機(jī)制

====第一次請(qǐng)求===

1.客戶端發(fā)起 HTTP GET 請(qǐng)求一個(gè)文件;

2.服務(wù)器處理請(qǐng)求,返回文件內(nèi)容和一堆Header,當(dāng)然需要包括Modified-Since(例如Thu, 01 Sep 2016 11:19:33 GMT).狀態(tài)碼200

====第二次請(qǐng)求===

1.客戶端發(fā)起 HTTP GET 請(qǐng)求一個(gè)文件,注意這個(gè)時(shí)候客戶端同時(shí)發(fā)送一個(gè)If-Modified-Since頭,這個(gè)頭的內(nèi)容就是第一次請(qǐng)求時(shí)服務(wù)器返回的If-Modified-Sinc:Thu, 01 Sep 2016 11:19:33 GMT

2.服務(wù)器判斷發(fā)送過來(lái)的If-Modified-Since和文件Modified-Since的匹配,如果相等服務(wù)器返回304客戶端利用緩存,否則返回200客戶端緩存文件;

這是第二次請(qǐng)求圖片


雖然動(dòng)態(tài)腳本文件對(duì)于客戶端來(lái)說(shuō)沒有修改時(shí)間一說(shuō),但是可以通過代碼修改響應(yīng)頭中的Modified-Since屬性,使動(dòng)態(tài)腳本文件緩存能夠被客戶端直接緩存起來(lái),直接減少網(wǎng)絡(luò)請(qǐng)求時(shí)間。

下面是從網(wǎng)上摘抄的一段代碼,同學(xué)們可以借鑒一下

private function _addEtag($file) {

? ? ? ? $last_modified_time = filemtime($file);

? ? ? ? $etag = md5_file($file);

? ? ? ? // always send headers

? ? ? ? header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");

? ? ? ? header("Etag: $etag");

? ? ? ? // exit if not modified

? ? ? ? if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time ||

? ? ? ? @trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {

? ? ? ? ? ? ? ? header("HTTP/1.1 304 Not Modified");

? ? ? ? ? ? ? ? exit;

? ? ? ? }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 淺談瀏覽器Http的緩存機(jī)制 ? ? ? ? ? ? ? ? 針對(duì)瀏覽器的http緩存的分析也算是老生常談了,每隔...
    meng_philip123閱讀 1,065評(píng)論 0 10
  • 針對(duì)瀏覽器的http緩存的分析也算是老生常談了,每隔一段時(shí)間就會(huì)冒出一篇不錯(cuò)的文章,其原理也是各大公司面試時(shí)幾乎必...
    全端玩法閱讀 905評(píng)論 0 9
  • 針對(duì)瀏覽器的http緩存的分析也算是老生常談了,每隔一段時(shí)間就會(huì)冒出一篇不錯(cuò)的文章,其原理也是各大公司面試時(shí)幾乎必...
    單純的土豆閱讀 406評(píng)論 0 2
  • 網(wǎng)絡(luò)特有的延遲以及數(shù)據(jù)傳輸?shù)某杀荆萍s互聯(lián)網(wǎng)快速獲取Web資源。為此,HTTP協(xié)議引入緩存以空間換時(shí)間,使瀏覽器緩...
    大頭8086閱讀 3,107評(píng)論 2 12
  • #iOS網(wǎng)絡(luò)緩存掃盲篇 #--使用兩行代碼就能完成80%的緩存需求 下篇預(yù)告:[使用80%的代碼來(lái)完成剩下的20%...
    coding_chen閱讀 2,131評(píng)論 0 11