asp教程.net 提供三種主要形式的緩衝:頁面級輸出緩衝、使用者控制項級輸出緩衝(或稱為片段快取)和緩衝 api。輸出緩衝和片段快取的優點是非常易於實現,在大多數情況下,使用這兩種緩衝就足夠了。而緩衝 api 則提供了額外的靈活性(實際上是相當大的靈活性),可用於在應用程式的每一層利用緩衝
緩衝 api,使用 cache 對象
頁面級和使用者控制項級輸出緩衝的確是一種可以迅速而簡便地提高網站效能的方法,但是在 asp.net教程 中,緩衝的真正靈活性和強大功能是通過 cache 對象提供的。使用 cache 對象,您可以儲存任何可序列化的資料對象,基於一個或多個依賴項的組合來控制緩衝條目到期的方式。這些依賴項可以包括自從項被緩衝後經過的時間、自從項上次被訪問後經過的時間、對檔案和/或檔案夾的更改以及對其他快取項目的更改,在略作處理後還可以包括對資料庫教程中特定表的更改。
在 cache 中儲存資料
在 cache 中儲存資料的最簡單的方法就是使用一個鍵為其賦值,就像 hashtable 或 dictionary 對象一樣:
cache["key"] = "value";
這種做法將在緩衝中儲存項,同時不帶任何依賴項,因此它不會到期,除非緩衝引擎為了給其他快取資料提供空間而將其刪除。要包括特定的緩衝依賴項,可使用 add() 或 insert() 方法。其中每個方法都有幾個重載。add() 和 insert() 之間的唯一區別是,add() 返回對已緩衝對象的引用,而 insert() 沒有傳回值(在 c# 中為空白,在 vb 中為 sub)。
樣本
cache.insert("key", myxmlfiledata, new
system.web.caching.cachedependency(server.mappath("users.xml")));
該樣本可將檔案中的 xml 資料插入緩衝,無需在以後請求時從檔案讀取。 cachedependency 的作用是確保緩衝在檔案更改後立即到期,以便可以從檔案中提取最新資料,重新進行緩衝。如果緩衝的資料來自若干個檔案,還可以指定一個檔案名稱的數組。
cache.insert("dependentkey", mydependentdata, new
system.web.caching.cachedependency(new string[] {}, new string[]
{"key"}));
該樣本可插入索引值為 "key" 的第二個資料區塊(取決於是否存在第一個資料區塊)。如果緩衝中不存在名為 "key" 的鍵,或者如果與該鍵相關聯的項已到期或被更新,則 "dependentkey" 的緩衝條目將到期。
cache.insert("key", mytimesensitivedata, null,
datetime.now.addminutes(1), timespan.zero);
絕對到期:此樣本將對受時間影響的資料緩衝一分鐘,一分鐘過後,緩衝將到期。注意,絕對到期和滑動到期(見下文)不能一起使用。
cache.insert("key", myfrequentlyaccesseddata, null,
system.web.caching.cache.noabsoluteexpiration,
timespan.fromminutes(1));
滑動到期:此樣本將緩衝一些頻繁使用的資料。資料將在緩衝中一直保留下去,除非資料未被引用的時間達到了一分鐘。注意,滑動到期和絕對到期不能一起使用
下面是一款詳細的執行個體。
using system.collections.generic;
using system.web;
using system;
namespace dataaccess
{
/// <summary>
/// 緩衝控制類
/// </summary>
public class cachecontrol
{
public static list<string> allusecachekey = new list<string>();
/// <summary>
/// 添加緩衝
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="absoluteexpiration"></param>
public static void addcache(string key, object value, datetime absoluteexpiration)
{
if (!allusecachekey.contains(key))
{
allusecachekey.add(key);
}
httpcontext.current.cache.add(key, value, null, absoluteexpiration, timespan.zero, system.web.caching.cacheitempriority.normal, null);
}
/// <summary>
/// 移除緩衝
/// </summary>
/// <param name="key"></param>
public static void removecache(string key)
{
if (allusecachekey.contains(key))
{
allusecachekey.remove(key);
}
httpcontext.current.cache.remove(key);
}
/// <summary>
/// 清空使用的緩衝
/// </summary>
public static void clearcache()
{
foreach (string value in allusecachekey)
{
httpcontext.current.cache.remove(value);
}
allusecachekey.clear();
}
}
}