| 2種方式來提升你的web 應用程序的速度: 1、減少請求和響應的往返次數 2、減少請求和響應的往返字節大小 HTTP緩存是最好的減少客戶端服務器端往返次數的辦法。緩存提供了提供一種機制來保證客戶端 或者代理能夠存儲一些東西,而這些東西將會在稍后的HTTP 響應中用到的。(即第一次請求了,到了客戶端,緩存起來,下次如果頁面還要這個JS文件或者CSS文件啥的,就不要到服務器端去取下來了,但是還是要去服 務器上去訪問一次,因為請求要對比ETAG值,關于這個值,我將會在下次翻譯中介紹其作用)這樣,就不用讓文件再次跨越整個網絡了。 緩存相關的請求頭? 為了提高性能,微軟的IE和其他的web客戶端總是想盡辦法來維持從遠程服務器上下載下來的本地的緩存。 當客戶端需要一個資源(html,css.js…),他們有3種可能的動作: 1 發送一個一般的HTTP請求到遠程服務器端,請求這個資源。 2 發送一個有條件的HTTP請求到服務器,條件就是如果它不同于本地的緩存版本。 3 如果緩存的拷貝可用,就使用本地的緩存資源。 當發送一個請求,客戶也許會使用如下的幾個HEADER Table 1. Client Cache Headers Pragma: no-cache | The client is unwilling to accept any cached responses from caches along the route and the origin server must be contacted for a fresh copy of the resource. If-Modified-Since: datetime | The server should return the requested resource only if the resource has been modified since the date-time provided by the client. If-None-Match: etagvalue | The server should return the requested resource if the ETAG of the resource is different than the value provided by the client. An ETAG is a unique identifier representing a particular version of a file. 解釋: 1 Pragma:no-cache 表明客戶端不愿意接受緩存請求,它需要的是最即時的資源。 2 If-Modified-Since: datetime 表明如果這個資源自從上次被客戶端請求,就已經修改了,那么服務器就會返回給客戶端最新的。 3 If-None-Match: etagvalue 如果客戶端資源的ETAG值跟服務器端不一致了,那么服務器端返回最新的資源。ETAG就是一個唯一的ID,用來表示一個文件的一個特定的版本。 如果要是這些有條件的請求,也就是含有If-Modified-Since 或者 If-None-MatchHeader頭的請求,服務器將會以HTTP/304 Not Modified 來作為響應,那么客戶端就知道可以使用客戶端的緩存了。否則,服務器將會返回一個新的響應并且客戶端就會拋棄過期的緩存資源。 你可以觀察2個連貫的請求,來請求同一個圖片,你會在Fiddler中發現:在第一個本地緩存 版本中,服務器返回一個含有ETAG的文件,和一個含有最后修改日期的文件,在這個第一次的請求會話中,一個本地的緩存版本已經可以使用了。這樣一來,一 個有條件的請求就被創建出來。然后你再次請求這個圖片的時候,他就就會響應一個本地緩存的文件,當然前提是第一次緩存的圖片的ETAG值或者If- Modified-Since 值跟服務器上匹配的話,服務器就響應一個304給客戶端。 Session #1 GET /images/banner.jpg HTTP/1.1 Host:?www.bayden.com HTTP/1.1 200 OK Date: Tue, 08 Mar 2006 00:32:46 GMT Content-Length: 6171 Content-Type: image/jpeg ETag: "40c7f76e8d30c31:2fe20" Last-Modified: Thu, 12 Jun 2003 02:50:50 GMT Session #2 GET /images/banner.jpg HTTP/1.1 If-Modified-Since: Thu, 12 Jun 2003 02:50:50 GMT If-None-Match: "40c7f76e8d30c31:2fe20" Host:?www.bayden.com HTTP/1.1 304 Not Modified 因為一個HTTP304響應僅僅包含頭,沒有body,所有它在穿越互聯網的時候要比攜帶了資源的快很多,盡管如此,HTTP/304響應需要一個服務器的往返,但是通過細心的設置響應頭,web程序員可以消除這種因素,甚至是有條件的請求。 緩存相關響應頭 通常緩存機制是由響應頭來控制的。HTTP規范描述了Header控制緩存,The optional Cache-Control,Expires(過期)。 Expires頭包含一個絕對的日期,當超過此日期,它將不會被考慮更新了。 Table 2. Common Cache-Control Headers public :The response may be stored in any cache, including caches shared among many users.? private :The response may only be stored in a private cache used by a single user.? no-cache :The response should not be reused to satisfy future requests.? no-store :The response should not be reused to satisfy future requests, and should not be written to disk. This is primarily used as a security measure for sensitive responses. max-age=#seconds :The response may be reused to satisfy future requests within a certain number of seconds.? must-revalidate :The response may be reused to satisfy future requests, but the origin server should first be contacted to verify that the response is still fresh. Cache-Control頭的參數設置: Public 響應會被緩存,并且在多用戶間共享。 Private 響應只能夠作為私有的緩存,不能再用戶間共享。 No-cache 響應不會被緩存 No-store 響應不會被緩存,并且不會被寫入到客戶端的磁盤里,這也是基于安全考慮的某些敏感的響應才會使用這個。 Max-age=#seconds 響應將會某個指定的秒數內緩存,一旦時間過了,就不會被緩存。 Must-revalidate 響應會被重用來滿足接下來的請求,但是它必須到服務器端去驗證它是不是仍然是最新的。 如果你發現你經常在你的網站上更新文件,但是并沒有更改文件名字,那你就必須要非常小心地設置 你的緩存生存時間。例如:如果你要一個thisyear.gif圖片文件顯示當前的年份在網站上,你需要保證這個緩存過期時間不能超過一天,否則一個用戶 在12月31號訪問你的網站的時候,在1月1號就不能顯示正確的日期。 由于某些原因,服務器可能會設置:Progma:no-cache 頭,Cache-control:no-cache Header中的參數:Vary 是一個緩存信號,Vary:User-Agent表示緩存當前的響應,但是僅限于當發送同樣的User-Agent 頭的時候。指令 Vary:* 就相當于Cache-Control:no-Cache。 Vary就相當于asp.net中的緩存的參數一樣,意思是根據什么來緩存,如果要是知道asp.net的緩存的使用方法,就很容易明白這個參數的意思。 如果響應不包含expires或者cache-control,那么客戶端就會被迫作為一個有條件的請求,來保證所有的資源都是最新的。 有條件的請求和WininetCache IE通過Microsoft windows Internet Services來最大程度的利用緩存服務。WinInet允許用戶配置緩存的大小和行為,設置緩存進行如下操作: 1 打開IE, 2 工具選項,選擇Internet選項,在一般子選項中,臨時文件夾內,點擊設置 HTTP壓縮 目前流行的WEB服務器和瀏覽器都提供HTTP壓縮支持。HTTP壓縮可以非常顯著地降低客戶端和服務器端的通訊量。節省超過50%的HTML,XML,CSS,JS等文件。 一個瀏覽器發送一個信號給服務器,他可以介紹HTTP壓縮過的內容,并且會把客戶端所支持的壓縮類型放在請求的Header中, 例如:考慮如下的請求: GET / HTTP/1.1? Accept: */* Accept-Language: en-us Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322) Host: search.msn.com 這個Accept-Encoding頭表明IE將愿意接受GZIP格式的和DEFLATE格式的壓縮響應。 相應的響應如下: HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Server: Microsoft-IIS/6.0 --Microsoft-HTTPAPI/1.0X-Powered-By: ASP.NET Vary: Accept-Encoding Content-Encoding: gzipDate: Tue, 15 Feb 2006 09:14:36 GMT Content-Length: 1277 Connection: close Cache-Control: private, max-age=3600 實驗表明,使用HTTP壓縮能大量減少數據往返,一個普通的CSS文件甚至能減少80%!當然壓縮是以犧牲CPU性能為代價的。特別是壓縮動態文件,但是一般的權宜之策是壓縮例如JS,CSS等靜態文 件,因為他們在第一次壓縮后,就會被存儲在服務器上,如果要壓縮asp.net動態文件,一定要有個權衡才行。 |