就是希望讓Web應用程式從一開始運行到結束都一直存在,有人就說為什麼不用Application呢?其實Cache是可以一段時間內自動更新資料的,而Application就無法做成這樣的,另外Application在Web這種高並發的系統中一定要考慮安全執行緒的問題,Application本身就不是安全執行緒的,而Cache就是安全執行緒。所以一般我都會在很多個物件中我只從Web開始啟動並執行時候從資料庫或檔案裡擷取一次資料,在不同的頁面中,都是使用Cache的,而且Cache中的資料可能弄成自動更新的,所以一般情況不需要考慮資料更新的問題,另外Cache也是也應用程式關聯的,全部可能駐留在該Web應用程式中的任何頁面。
當然首先我們應該熟悉一下System.Web.Caching.Cache這個類,我這裡也就只說說其中使用比較多的幾個方法和屬性,如果需要更詳細的介紹請查閱MSDN。
首先介紹它的Add()方法,將指定的對象添加到Cache對象集合中。
Insert()方法將覆蓋有相同Key的Cache頂。
Remove()從應用程式的Cache對象中移除指定項。
Count屬性,擷取儲存在緩衝中對象數。
這裡我主要要說的是Add()方法,因為我們如果想要長期存在Cache並且在一段時間內自動替換Cache,就必須非常瞭解它。我們看看MSDN中對該方法的詳細介紹吧。呵。
C#
public Object Add(
string key,
Object value,
CacheDependency dependencies,
DateTime absoluteExpiration,
TimeSpan slidingExpiration,
CacheItemPriority priority,
CacheItemRemovedCallback onRemoveCallback
)
參數
-
key
-
類型:System.String
用於引用該項的緩衝鍵。
-
value
-
類型:System.Object
要添加到緩衝的項。
-
dependencies
-
類型:System.Web.Caching.CacheDependency
該項的檔案依賴項或緩衝鍵依賴項。當任何依賴項更改時,該對象即無效,並從緩衝中移除。如果沒有依賴項,則此參數包含 nullNothingnullptrnull 引用(在 Visual Basic 中為 Nothing)。
-
absoluteExpiration
-
類型:System.DateTime
所添加對象將到期並被從緩衝中移除的時間。如果使用可調到期,則 absoluteExpiration 參數必須為 NoAbsoluteExpiration。
-
slidingExpiration
-
類型:System.TimeSpan
最後一次訪問所添加對象時與該對象到期時之間的時間間隔。如果該值等效於 20 分鐘,則對象在最後一次被訪問 20 分鐘之後將到期並從緩衝中移除。如果使用絕對到期,則 slidingExpiration 參數必須為 NoSlidingExpiration。
-
priority
-
類型:System.Web.Caching.CacheItemPriority
對象的相對成本,由 CacheItemPriority 枚舉表示。緩衝在退出對象時使用該值;具有較低成本的對象在具有較高成本的對象之前被從緩衝移除。
-
onRemoveCallback
-
類型:System.Web.Caching.CacheItemRemovedCallback
在從緩衝中移除對象時所調用的委託(如果提供)。當從緩衝中刪除應用程式的對象時,可使用它來通知應用程式。
傳回值
類型:System.Object
備忘
如果 Cache 中已儲存了具有相同 key 參數的項,則對此方法的調用將失敗。若要使用相同的 key 參數覆蓋現有的 Cache 項,請使用 Insert 方法。
無法同時設定 absoluteExpiration 和 slidingExpiration 參數。如果要讓快取項目在特定時間到期,可將 absoluteExpiration 參數設定為特定時間,並將 slidingExpiration 參數設定為 NoSlidingExpiration。
如果要讓快取項目在最後一次訪問該項後的某段時間之後到期,可將 slidingExpiration 參數設定為到期間隔,並將 absoluteExpiration 參數設定為 NoAbsoluteExpiration。
此段轉載自MSDN
具體的怎樣添加這種緩衝了,一般情況我會在主版頁面中Init事件或Load事件中添加緩衝,因為這樣可以保證引用程式從一開始執行就可以將需要頻繁使用的對象緩衝起來了。
protected void Page_Load(object sender, EventArgs e)
{
Cache.Add("key", //需要添加到Cache中的鍵
new { value="添加值"}, //對應的值
null, //緩衝依賴項。
DateTime.Now.AddMinutes(1),//固定緩衝時間
System.Web.Caching.Cache.NoSlidingExpiration, //可到延時緩衝時間,
System.Web.Caching.CacheItemPriority.NotRemovable, //緩衝中的優先順序。
new System.Web.Caching.CacheItemRemovedCallback(OnMoveCacheBack));//移除時調用的回呼函數
}
public void OnMoveCacheBack(string key, object value, System.Web.Caching.CacheItemRemovedReason reason)
{
if (Cache[key] != null)
{
Cache.Remove(key);
}
Cache.Add("key", //需要添加到Cache中的鍵
new { value = "更新值" }, //對應的值
null, //緩衝依賴項。
DateTime.Now.AddMinutes(1),//固定緩衝時間
System.Web.Caching.Cache.NoSlidingExpiration, //可到延時緩衝時間,
System.Web.Caching.CacheItemPriority.NotRemovable, //緩衝中的優先順序。
new System.Web.Caching.CacheItemRemovedCallback(OnMoveCacheBack));//移除時調用的回呼函數
}
參數的具體使用上一定要注意三點,
第一就是緩衝的依賴項一定要指定為null。
第二固定到期緩衝時間不能和可到延時緩衝時間同時指定時間,實現我說的定期更換資料的,當然就要使用固定到期緩衝時間了。
第三就是該緩衝的優先順序了,這個也比較關鍵,一定要指定為System.Web.Caching.CacheItemPriority.NotRemovable枚舉值,這樣才不會被自動收回,但是一定要注意該緩衝的大小。