ASP.NET狀態管理之六(緩衝Cache)

來源:互聯網
上載者:User

ASP.NET 為您提供了一個強大的、便於使用的緩衝機制,用於將需要大量伺服器資源來建立的Object Storage Service在記憶體中。緩衝這些類型的資源會大大改進應用程式的效能。

緩衝是由 Cache 類實現的;緩衝執行個體是每個應用程式專用的。緩衝生存期依賴於應用程式的生存期;重新啟動應用程式後,將重新建立 Cache 對象。

設計 Cache 類是為了便於使用。您可以將項放置在 Cache 中,並在以後使用簡單的鍵/值對來檢索這些項。

Cache 類提供了強大的功能,允許您自訂如何快取項目以及將它們緩衝多長時間。例如,當缺乏系統記憶體時,緩衝會自動移除很少使用的或優先順序較低的項以釋放記憶體。該技術也稱為清理,這是緩衝確保到期資料不使用寶貴的伺服器資源的方式之一。

當執行清理時,您可以指示 Cache 給予某些項比其他項更高的優先順序。若要指示項的重要性,可以在使用 Add 或 Insert 方法添加項時指定一個 CacheItemPriority 枚舉值。

當使用 Add 或 Insert 方法將項添加到緩衝時,您還可以建立項的到期策略。您可以通過使用 DateTime 值指定項的確切到期時間(絕對到期時間),來定義項的生存期。也可以使用 TimeSpan 值指定一個彈性到期時間,彈性到期時間允許您根據項的上次訪問時間來指定該項到期之前的已耗用時間。一旦項到期,便將它從緩衝中移除。試圖檢索它的值的行為將返回 null(在 Visual Basic 中為 Nothing),除非該項被重新添加到緩衝中。

對於儲存在緩衝中的易失項(例如那些定期進行資料重新整理的項或那些只在一段時間內有效項),通常設定一種到期策略:只要這些項的資料保持為最新的,就將它們保留在緩衝中。例如,如果您正在編寫一個應用程式,該應用程式通過另一個網站擷取資料來跟蹤體育比賽的比分,那麼只要源網站上比賽的比分不更改,就可以緩衝這些比分。在此情況下,您可以根據其他網站更新比分的頻率來設定到期策略。您可以編寫代碼來確定緩衝中是否是最新的比分。如果該比分不是最新的,則代碼可以從源網站讀取比分並緩衝新值。

最後,ASP.NET 允許您根據外部檔案、目錄(檔案依賴項)或另一個快取項目(鍵依賴項)來定義快取項目的有效性。如果具有關聯依賴項的項發生更改,快取項目便會失效並從緩衝中移除。您可以使用該技術在項的資料來源更改時從緩衝中移除這些項。例如,如果您編寫一個處理 XML 檔案中的財務資料的應用程式,則可以從該檔案將資料插入緩衝中並在此 XML 檔案上保留一個依賴項。當該檔案更新時,從緩衝中移除該項,您的應用程式重新讀取 XML 檔案,然後將重新整理後的資料放入緩衝中。

 

將項添加到緩衝中
可以使用 Cache 對象訪問應用程式緩衝中的項。可以使用 Cache 對象的 Insert 方法嚮應用程式緩衝添加項。該方法向緩衝添加項,並且通過幾次重載,您可以用不同選項添加項,以設定依賴項、到期和移除通知。如果使用 Insert 方法向緩衝添加項,並且已經存在與現有項同名的項,則緩衝中的現有項將被替換。

還可以使用 Add 方法向緩衝添加項。使用此方法,您可以設定與 Insert 方法相同的所有選項;然而,Add 方法將返回您添加到緩衝中的對象。另外,如果使用 Add 方法,並且緩衝中已經存在與現有項同名的項,則該方法不會替換該項,並且不會引發異常。

通過鍵和值直接設定項向緩衝添加項
通過指定項的鍵和值,像將項添加到字典中一樣將其添加到緩衝中。
下面的程式碼範例將名為 CacheItem1 的項添加到 Cache 對象中:
Cache["CacheItem1"] = "Cached Item 1";

通過使用 Insert 方法將項添加到緩衝中
調用 Insert 方法,傳遞要添加的項的鍵和值。
下面的程式碼範例添加名為 CacheItem2 的字串:
Cache.Insert("CacheItem2", "Cached Item 2");

通過指定依賴項向緩衝添加項
調用 Insert 方法,將 CacheDependency 對象的一個執行個體傳遞給該方法
下面的程式碼範例添加名為 CacheItem3 的項,該項依賴於緩衝中名為 CacheItem2 的另一個項:
string[] dependencies = { "CacheItem2" };
Cache.Insert("CacheItem3", "Cached Item 3",
    new System.Web.Caching.CacheDependency(null, dependencies));

下面的程式碼範例示範將名為 CacheItem4 的項添加到緩衝中,並且在名為 XMLFile.xml 的檔案上設定檔案依賴項:
Cache.Insert("CacheItem4", "Cached Item 4",
    new System.Web.Caching.CacheDependency(
    Server.MapPath("XMLFile.xml")));

下面的程式碼範例示範如何建立多個依賴項。它向緩衝中名為 CacheItem1 的另一個項添加鍵依賴項,向名為 XMLFile.xml 的檔案添加檔案依賴項。
System.Web.Caching.CacheDependency dep1 =
    new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile.xml"));
string[] keyDependencies2 = { "CacheItem1" };
System.Web.Caching.CacheDependency dep2 =
    new System.Web.Caching.CacheDependency(null, keyDependencies2);
System.Web.Caching.AggregateCacheDependency aggDep =
    new System.Web.Caching.AggregateCacheDependency();
aggDep.Add(dep1);
aggDep.Add(dep2);
Cache.Insert("CacheItem5", "Cached Item 5", aggDep);

將設有到期策略的項添加到緩衝中
調用 Insert 方法,將絕對到期時間或彈性到期時間傳遞給該方法。
下面的程式碼範例將有一分鐘絕對到期時間的項添加到緩衝中:
Cache.Insert("CacheItem6", "Cached Item 6",
    null, DateTime.Now.AddMinutes(1d),
    System.Web.Caching.Cache.NoSlidingExpiration);

下面的程式碼範例將有 10 分鐘彈性到期時間的項添加到緩衝中:
Cache.Insert("CacheItem7", "Cached Item 7",
    null, System.Web.Caching.Cache.NoAbsoluteExpiration,
    new TimeSpan(0, 10, 0));

將設有優先順序設定的項添加到緩衝中
調用 Insert 方法,從 CacheItemPriority 枚舉中指定一個值。
下面的程式碼範例將優先順序值為 High 的項添加到緩衝中:
Cache.Insert("CacheItem8", "Cached Item 8",
    null, System.Web.Caching.Cache.NoAbsoluteExpiration,
    System.Web.Caching.Cache.NoSlidingExpiration,
    System.Web.Caching.CacheItemPriority.High, null);

使用 Add 方法向緩衝添加項
調用 Add 方法,它返回一個表示項的對象。
下面的程式碼範例向緩衝添加名為 CacheItem9 的項,同時將變數 CachedItem9 的值設定為已添加的項。
string CachedItem9 = (string)Cache.Add("CacheItem9",
    "Cached Item 9", null,
    System.Web.Caching.Cache.NoAbsoluteExpiration,
    System.Web.Caching.Cache.NoSlidingExpiration,
    System.Web.Caching.CacheItemPriority.Default,
    null);

緩衝依賴例題:
我們在一頁面建立1個按鈕,查看CACHE是否存在
在表單啟動時我們建立CACHE,名稱="txt2",數值=資料集ds
該CACHE與myfile.xml相關聯,當myfile.xml檔案變化時,txt2CACHE就被自動刪除

private void Page_Load(object sender, System.EventArgs e)
  {
   if( !IsPostBack  )
   {
   string FilePath=MapPath("myfile.xml");
   SqlConnection con=new SqlConnection("Uid=sa;database=pubs;");
   SqlDataAdapter da =new SqlDataAdapter("select * from authors",con);
   DataSet ds=new DataSet();
   da.Fill(ds);
   System.Web.Caching.CacheDependency CacheDependencyXmlFile=new System.Web.Caching.CacheDependency(FilePath);
   Cache.Insert("txt2",ds ,CacheDependencyXmlFile);
   }
  }

為了監視pubs資料庫authors表的變化
我們可以在pubs資料庫authors表建立觸發器
一旦authors表中發生增加,刪除,修改資料時,觸發器會自動修改檔案myfile.xml
一旦myfile.xml檔案變化,txt2CACHE就被系統自動刪除

CREATE TRIGGER tr_authors
ON authors
FOR INSERT, UPDATE ,delete
AS
declare @cmd nvarchar(4000)
select @cmd='bcp "select convert(nvarchar(30),Getdate(),13)" queryout D:\cache\WebCache\myfile.xml -c -Sglc2403 -Usa -P'
exec master..xp_cmdshell @cmd
GO

private void QueryButton_Click(object sender, System.EventArgs e)
{
if ( Cache["txt2"]!=null)
{
 Response.Write("exists");
}
else
{
 Response.Write("not exists");
}
}

首先我們點按鈕,顯示Cache["txt2"]存在
現在我們去表authors中任意修改一資料,再點按鈕,顯示Cache["txt2"]不存在拉

以上我們是把CACHE是和一個檔案相關聯,我們還可以把CACHE和檔案組關聯,建立依賴
以下我們把CACHE和2個檔案(myfile.xml,myfile1.xml)關聯,一旦檔案組中其中任意一檔案變化,Cache會把"txt2"項的資料從CACHE中刪除

string[] FilePath=new String[]{MapPath("myfile.xml"),MapPath("myfile1.xml")};
System.Web.Caching.CacheDependency CacheDependencyXmlFile=new                     System.Web.Caching.CacheDependency(FilePath);
string CacheVaule="a";
Cache.Insert("txt2", CacheVaule ,CacheDependencyXmlFile);

 

緩衝依賴可以是檔案,還可以是其他對象的鍵
下面的代碼說明緩衝Cache["txt2"]既依賴檔案myfile.xml,又依賴緩衝中的Cache["txt"],只要這2者任意一樣改變,緩衝Cache["txt2"]就會清除

Cache["txt"] = "b";
string[] FilePath=new String[]{ MapPath("myfile.xml")};
string[] dependencyKey=new String[]{"txt"};
SqlConnection con=new SqlConnection("Uid=sa;database=pubs;");
SqlDataAdapter da =new SqlDataAdapter("select * from authors",con);
DataSet ds=new DataSet();
da.Fill(ds);
System.Web.Caching.CacheDependency CacheDependencyXmlFile=
          new System.Web.Caching.CacheDependency(FilePath,dependencyKey);
Cache.Insert("txt2",ds ,CacheDependencyXmlFile);

 

檢索快取項目的值
要從緩衝中檢索資料,應指定儲存快取項目的鍵。不過,由於緩衝中所儲存的資訊為易失資訊,即該資訊可能由 ASP.NET 移除,因此建議的開發模式是首先確定該項是否在緩衝中。如果不在,則應將它重新添加到緩衝中,然後檢索該項。

通過在 Cache 對象中進行檢查來確定該項是否不為 null(在 Visual Basic 中為 Nothing)。如果該項存在,則將它分配給變數。否則,重新建立該項,將它添加到緩衝中,然後訪問它。
下面的程式碼範例示範如何確定名為 CacheItem 的項是否包含在緩衝中。如果在,則代碼會將該項的內容分配給名為 cachedString 的變數。如果該項不在緩衝中,則代碼會將它添加到緩衝中,然後將它分配給 cachedString。
string cachedString;
if (Cache["CacheItem"] != null)
{
    cachedString = (string)Cache["CacheItem"];
}
else
{
    Cache.Insert("CacheItem", "Hello, World.");
    cachedString = (string)Cache["CacheItem"];
}

 

從 ASP.NET 緩衝中刪除項
ASP.NET 緩衝中的資料是易失的,即不能永久儲存。由於以下任一原因,緩衝中的資料可能會自動移除:
1.緩衝已滿。
2.該項已到期。
3.依賴項發生更改。

從緩衝中顯式刪除項
調用 Remove 方法,以傳遞要移除的項的鍵。
下面的樣本示範如何移除鍵為 MyData1 的項。
Cache.Remove("MyData1");

從緩衝中移除項時通知應用程式
在大多數緩衝方案中,當從緩衝中移除項後,直到再次需要此項時,才需要將其放回緩衝中。典型的開發模式是在使用項之前始終檢查該項是否已在緩衝中。如果項位於緩衝中,則可以使用。如果不在緩衝中,則應再次檢索該項,然後將其添加回緩衝。

但是,在某些情況下,如果從緩衝中移除項時通知應用程式,可能非常有用。例如,您可能具有一個緩衝的報告,建立該報告需花費大量的時間進行處理。當該報告從緩衝中移除時,您希望重建該報告,並立即將其置於緩衝中,以便下次請求該報告時,使用者不必等待對此報告進行處理。

為了在從緩衝中移除項時能夠發出通知,ASP.NET 提供了 CacheItemRemovedCallback 委託。該委託定義編寫事件處理常式時使用的簽名,當對從緩衝中移除項進行響應時會調用此事件處理常式。ASP.NET 還提供 CacheItemRemovedReason 枚舉,用於指定移除快取項目的原因。

通常,通過在管理嘗試檢索的特定快取資料的業務對象中建立處理常式,來實現回調。例如,您可能有一個 ReportManager 對象,該對象具有兩種方法,即 GetReport 和 CacheReport。GetReport 報告方法檢查緩衝以查看報告是否已緩衝;如果沒有,該方法將重建報告並將其緩衝。CacheReport 方法具有與 CacheItemRemovedCallback 委託相同的函數簽名;從緩衝中移除報告時,ASP.NET 會調用 CacheReport 方法,然後將報告重新添加到緩衝中。

當從緩衝中移除項時通知應用程式
1.建立一個類,負責從緩衝中檢索項並處理回調方法,以將項添加回緩衝中。
2.在該類中,建立用於將項添加到緩衝中的方法。
3.在該類中,建立用於從緩衝中擷取項的方法。
4.建立用於處理快取項目移除回調的方法。該方法必須具備與 CacheItemRemovedCallback 委託相同的函數簽名。從緩衝中刪除項時,會在該方法中執行要啟動並執行邏輯,如重建項並將其添加回緩衝中。

static System.Web.Caching.CacheItemRemovedReason reason;
System.Web.Caching.CacheItemRemovedCallback onRemove = null;

public void RemovedCallback(String k, Object v, System.Web.Caching.CacheItemRemovedReason r)
{
 itemRemoved = true;
 reason = r;
}

onRemove = new System.Web.Caching.CacheItemRemovedCallback (this.RemovedCallback);
Cache.Insert("txt",ds,null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Default,onRemove);

 

由於任何原因從Cache中移除時,將調用 RemovedCallback 方法

 

 

http://aierong.cnblogs.com

Sql Server2005 Transact-SQL 新兵器學習總結之-總結
MS SQLDatabase Backup和恢複預存程序(加強版本)
sql server中分散式查詢隨筆(連結的伺服器(sp_addlinkedserver)和遠程登入映射(sp_addlinkedsrvlogin)使用小總結)
WAP開發資料站(最新更新)
自訂格式字串隨筆 (IFormattable,IFormatProvider,ICustomFormatter三介面的實現)
Mcad學習筆記之非同步編程(AsyncCallback 委託,IAsyncResult介面,BeginInvoke方法,EndInvoke方法的使用小總結)
Mcad學習筆記之通過反射調用類的方法,屬性,欄位,索引器(2種方法)
Mcad學習筆記之序列化(2進位和Soap序列化)
Mcad學習筆記之委託再理解(delegate的構造器,BeginInvoke,EndInvoke,Invoke4個方法的探討)
WinForm開發,表單顯示和表單傳值相關知識總結
Mcad學習筆記之Microsoft Windows服務
copy某目錄下的所有的目錄和檔案到目的目錄(目錄數據備份)
ASP.NET狀態管理之一(概括篇)

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.