前面所說技術訂都是服務器端一個人在努力,有時候也需要客戶端配合。
一個鏈接請求過程大致可以分成幾個階段
如果客戶端發送同樣的請求,且結果都一樣,我們是不是可以緩衝一下呢?是不是可以減少幾步呢?
的確可以,一般來說以下幾種方法:
1.我們先試着在服務端進行緩衝,我們試着將一個已經返回的長鏈接發送內容不作釋放,下次請求時直接返回剛纔發送的內容,這個不適用於頻繁訪問,適用於一些特殊的情況,特殊的請求。
2.對於靜態的文件都有上次修改時間lastupdatetime,客戶端第一次請求返回的http頭包含這個 lastupdatetime,接着客戶端將頁面加到緩存裏,第二次請求頭裏包含lastupdatetime,服務端將它和當前的lastupdatetime 進行比較,如果一樣,直接告訴客戶端文件還沒修改,直接用你緩存裏的。
實際上http返回頭存更新時間的字段是Last-Modified,請求頭的字段是If-Modified-Since
如
返回包頭
HTTP/1.1 200 OK
Date: Wed, 20 Mar 2013 07:35:22 GMT
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Last-Modified: Wed, 20 Mar 2013 07:35:22 GMT
Transfer-Encoding: chunked
Server: yumeiz
請求包頭
GET / HTTP/1.1
Host: www.xxx.com
Connection: keep-alive
If-Modified-Since: Wed, 20 Mar 2013 07:35:22 GMT
再次返回包頭:
HTTP/1.1 304 Not Modified
對於一些沒有修改時間的動態請求,服務端可以約定一個字段,當第二次請求發現這個字段沒變,也告訴客戶端直接用緩存裏的內容。
實際上這個字段是ETag,請求頭的字段是If-None-Match
如
返回包頭(只點到相應字段,其他與上面一致)
ETag="ABCD"
請求包頭
If-None-Match=W/"ABCD"
通過上面我們知道當客戶端收到一個 304 Not Modified 的包頭時,就意味着可以直接用緩存裏的頁面,對一些頻繁請求的文件如JS,CSS有不小的作用,還有一些塊頭很大的圖像文件,意味着送去了救命道草。。。
3.上面的幾種方法實際上都需要服務端參與,我們知道有些文件如JS,CSS,HTML,改變的頻率實在太小,但是請求的頻率又實在太大,有請求就有壓力,服務端就算返回304也還有很大的併發壓力,那麼是不是可以讓客戶端直接用緩存裏而不再確認呢?
還記得cookie有個過期時間嗎,請求也可以有過期時間,當這個請求還沒過期的情況下再次請求,客戶端直接加載緩存的頁面,不再確認,no check, no link, no server!
這樣就徹底與服務器失去的聯繫,給服務器減輕多少壓力,減少了多少帶寬。。。
實際上這個這個字段是 Expires
如
HTTP/1.1 200 OK
Date: Wed, 20 Mar 2013 07:35:22 GMT
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Expires: Wed, 20 Mar 2013 08:01:22 GMT
Transfer-Encoding: chunked
Server: yumeiz
還有一個字段 max-age,作用一樣,而且可以覆蓋Expires。
max-age意思就是從現在開始,這個頁面要經過多少秒才過期。
max-age 的使用方式:
Cache-Control:max-age=3600
回頭看看,第1,2種方法其實是省略了服務端的業務處理,第3種方法是壓根兒沒服務端啥事了,相當於一段時間內脫機處理,雖然有悖於互聯的精神,但是確實能解決問題。
以上幾種方法也可以混合使用,如返回包頭同時包含expires和Last-Modified,如
HTTP/1.1 200 OK
Date: Wed, 20 Mar 2013 07:35:22 GMT
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Last-Modified: Wed, 20 Mar 2013 03:35:22 GMT
Expires: Wed, 20 Mar 2013 08:01:22 GMT
Transfer-Encoding: chunked
Server: yumeiz
當expires沒有過期前直接用客戶端的緩存,如果過期了則再請求服務端,服務端檢查文件修改時間沒變則返回304,同時刷新expires.
如:
HTTP/1.1 304 Not Modified
Server: yumeiz
Date: Wed, 20 Mar 2013 08:02:22 GMT
Vary: Accept-Encoding
Last-Modified: Wed, 20 Mar 2013 03:35:22 GMT
Expires: Wed, 20 Mar 2013 08:35:22 GMT
Cache-Control: max-age=31536000