一般減少數(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;
? ? ? ? }
}