大併發伺服器不得不說的技術 http 快取

2021-06-13 04:43:19 字數 2772 閱讀 2196

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

乙個鏈結請求過程大致可以分成幾個階段

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

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

1.我們先試著在服務端進行緩衝,我們試著將乙個已經返回的長鏈結傳送內容不作釋放,下次請求時直接返回剛才傳送的內容,這個不適用於頻繁訪問,適用於一些特殊的情況,特殊的請求。

2.對於靜態的檔案都有上次修改時間lastupdatetime,客戶端第一次請求返回的http頭包含這個 lastupdatetime,接著客戶端將頁面加到快取裡,第二次請求頭里包含lastupdatetime,服務端將它和當前的lastupdatetime 進行比較,如果一樣,直接告訴客戶端檔案還沒修改,直接用你快取裡的。

實際上http返回頭存更新時間的字段是last-modified,請求頭的字段是if-modified-since

如返回包頭

請求包頭

再次返回包頭:

對於一些沒有修改時間的動態請求,服務端可以約定乙個字段,當第二次請求發現這個欄位沒變,也告訴客戶端直接用快取裡的內容。

實際上這個欄位是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,如

當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

大併發伺服器不得不說的技術 tcp cork

如果把tcp當成服務端與客戶端的管道,cork 就是給管道加個塞子。為什麼 要加個塞子呢?先來舉個例子 int times 10 while times 這段program會傳送資料10次,每次就傳送1個位元組,這樣會不會什麼問題呢?記得以前農忙的時候,田裡的稻子收割完了,要打成稻穀,就放乙個打稻機...

大併發伺服器不得不說的技術 tcp cork

from 如果把tcp當成服務端與客戶端的管道,cork 就是給管道加個塞子。為什麼 要加個塞子呢?先來舉個例子 cpp view plain copy print?int times 10 while times int times 10 while times 這段program會傳送資料10次...

大併發伺服器不得不說的技術 TCP CORK

sol tcp,tcp cork 的標頭檔案 include cork選項提高了網路的利用率,因為它直接禁止了小包的傳送。nagle演算法沒有禁止小包傳送,只是禁止了大量小包的傳送。如果把tcp當成服務端與客戶端的管道,cork 就是給管道加個塞子。為什麼 要加個塞子呢?先來舉個例子 int tim...