大併發服務器不得不說的技術--http 緩存

前面所說技術訂都是服務器端一個人在努力,有時候也需要客戶端配合。

一個鏈接請求過程大致可以分成幾個階段



如果客戶端發送同樣的請求,且結果都一樣,我們是不是可以緩衝一下呢?是不是可以減少幾步呢? 


的確可以,一般來說以下幾種方法:

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章