之是以用這個題目是因為很多人常常問我研究開源項目的意義,有一些開源項目在别人眼裡看起來完全沒有搞頭,是一些沒有實用價值的項目。其實開源項目往往是新技術的試驗田,是全世界優秀程式開發者智慧的彙集,如果你仔細研讀這些開源項目,得到的不僅僅是這個項目的功能,而是觀摩新的技術,學習比你更聰明人的智慧。
這一系列的文章:
<a href="http://www.cnblogs.com/DotNetNuke/archive/2008/11/19/1336862.html" target="_blank">開源項目大家談-網站性能調校-Page State Persistence</a>
<a href="http://www.cnblogs.com/DotNetNuke/archive/2008/11/20/1337608.html" target="_blank">開源項目大家談-網站性能調校-Cache的使用</a>
對于緩存(Cache)的概念我想大家都很熟悉,網上也有很多介紹的文章,我在這裡就不贅述了。
雖然大家都知道這個概念,但大家在做項目的時候不一定都思考過如何以及何時使用緩存。
我們來看看這個開源系統的這個設定:

對于如何選擇這個兩項,似乎沒什麼太難了解的,這裡是決定把對module的緩存放在記憶體裡還是放在硬碟裡,當然,選擇"Memory"會提高速度。
但有一點是我們要學習的,那就是為什麼會有這麼一個選擇。之是以出現這樣一個選擇,是因為這個開源系統的設計人員發現這個系統對于module這一部分的操作特别頻繁,是以對于所有讀取出的module資訊都會放入緩存,進而加快系統的速度,也就是說,設計人員主動的分析了系統的特點,使用了緩存,這是最值得我們學習的地方。
在這個開源項目中,我們可以看到這樣一個選項,對于"Performance Settings",你可以選擇:
No Caching
Light Caching
Moderate Caching
Heavy Caching
調節這些設定肯定能調校網站的性能,當到底有什麼影響呢?技術上又是如何實作的呢?
檢視源代碼,我們發現PerformanceSettings 的值有三種,分别是0、1、3、6,那這幾個值又是如何來控制cache的性能,進而調校整個網站的性能呢?
我們看看下面的代碼就可以明白了:
原來,系統使用PerformanceSettings的值來控制cache的生存時間,進而為不同特性的網站内容提供不同的cache生存時間,達到調校網站性能的目的。這的确是一個值得學習的精妙設計。
在這個開源系統的性能設定裡,還有一個Authenticated Cacheability的設定:
Cache可以應用在伺服器端,也可以使用在用戶端,用戶端對于通路的網頁都會進行緩存,但出于某種原因,你也可以指定用戶端不緩存你的網頁。
這些設定當然會影響到你網站的性能,相對于做了緩存的頁面,沒有緩存的頁面需要花更多的時間來顯示。
這個開源系統利用了這一點,你可以自己選擇用戶端緩存的方式,有幾個選項還會影響到伺服器端的緩存。下面是關鍵的代碼:
對于HttpCacheability的幾個值代表的意義如下:
NoCache:設定 Cache-Control: no-cache 标頭。如果沒有字段名,則指令應用于整個請求,且在滿足請求前,共享(代理伺服器)緩存必須對原始 Web 伺服器強制執行成功的重新驗證。如果有字段名,則指令僅應用于命名字段;響應的其餘部分可能由共享緩存提供。
Private: 預設值。設定 Cache-Control: private 以指定響應隻能緩存在用戶端,而不能由共享(代理伺服器)緩存進行緩存。
Server: 指定響應僅緩存在源伺服器上。與 NoCache 選項相似。客戶機接收 Cache-Control: no-cache 指令,但文檔是在原始伺服器上緩存的。等效于 ServerAndNoCache。
ServerAndNoCache: 應用 Server 和 NoCache 的設定訓示在伺服器上緩存内容,而對伺服器以外的其他對象都顯式否定其緩存響應的能力。
Public: 設定 Cache-Control: public 以指定響應能由用戶端和共享(代理)緩存進行緩存。
ServerAndPrivate: 訓示響應隻能在伺服器和用戶端緩存。代理伺服器不能緩存響應。
對于很多網站,内容的保密性要求并不高,是以推薦設定為"Public”,這樣能取得最大的性能優勢。
關于Authenticated Cacheability更具體的知識大家可以參考下面的幾個文檔:
<a href="http://www.cnblogs.com/kangtr/archive/2007/01/30/634733.html">[轉]Asp.net 緩存(二)--設定頁的可緩存性</a>
<a href="http://msdn.microsoft.com/en-us/library/system.web.httpcacheability%28VS.80%29.aspx">MSDN: HttpCacheability Enumeration</a>
<a href="http://blogs.snapsis.com/PermaLink,guid,46c9ab35-9bb7-4ff9-a8e9-63ff3497c7f0.aspx">John Mitchell's (mostly DotNetNuke) Blog</a>