天天看點

ASP.NET Cache 緩存 Cache.Add方法 筆記

實作功能:定時重新整理Cache

錯誤了解:在使用Cache前,我個人了解是Cache會提供一個定時執行的方法。比如每隔10分鐘執行一項任務,而這個任務就要重新整理Cache。看MSDN上的文檔繞了很久才明白,是對參數的了解錯誤了。

MSDN示例:連結

了解事項:

1. 使用Cache.Add 方法要先檢查Cache[“Key”] (要添加的Key)是否存在,如果存在 Add時會報錯(未驗證),如果用Cache.Insert 方法則會更新目前Cache[“Key”] 。

2. Cache.Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);。其中 C#緩存absoluteExpiration、slidingExpiration兩個參數的疑惑,absoluteExpiration:用于設定絕對過期時間,它表示隻要時間一到就過期,是以類型為System.DateTime,當給這個參數設定了一個時間時,slidingExpiration參數的值就隻能為Cache.NoSlidingExpiration,否則出錯;slidingExpiration:用于設定可調過期時間,它表示當離最後通路超過某個時間段後就過期,是以類型為System.TimeSpan,當給這個參數設定了一個時間段時,absoluteExpiration的值就隻能為Cache.NoAbsoluteExpiration,否則出錯;

3. Cache.Add的參數

CacheItemRemovedCallback onRemoveCallback

是 從删除緩存項時的回調方法,删除操作包括:1,Cache.Remove(“Key1”) 操作 2,Cache的Expire過期值到了。而我錯我的了解是認為:我要的功能是定時更新,第3、4個參數可設定定時,可 更新(Update)怎麼和移除(Remove)聯系起來呢? 正确的了解應該是:當Cache過期了 或者被移除了的時候,Cache會自定去執行指定的委托,在這個委托關聯的方法裡可以根據需要實作如何重新整理Cache。MSDN說明 。

Cache["Key1"] = null;

将報錯,Cache[“Key1”] 值不能為 null。

4. 促使我了解的連結:從緩存中移除項時通知應用程式。裡面提到了緩存處理方案,也就是執行個體,這才能明白。

5. Cache.Insert的方法最後參數類型 CacheItemUpdateCallback表示:Cache項删除前要做的操作(了解上類似SqlServer中的Inserted、Deleted)。

6. .NET API MSDN連結 。

下面代碼說明:

1. 要執行代碼,可建立Web空項目,添加一個web窗體,并見代碼複制到裡面。

2. AddItemToCache()方法執行時,會添加一個key為”Key1”,value為”Value 1”的Cache,并設定當過期時間為60秒,當過期時或被移除時執行CacheItemRemovedCallback 委托關聯的RemovedCallback方法。

<html>
 <Script runat=server language="C#">
// <snippet2>
    static bool itemRemoved = false;
    static CacheItemRemovedReason reason;
    CacheItemRemovedCallback onRemove = null;

    public void RemovedCallback(String k, Object v, CacheItemRemovedReason r){
      itemRemoved = true;
      reason = r;
    }
// </snippet2>

// <snippet3>
    public void AddItemToCache(Object sender, EventArgs e) {
        itemRemoved = false;

        onRemove = new CacheItemRemovedCallback(this.RemovedCallback);

        if (Cache["Key1"] == null)
          Cache.Add("Key1", "Value 1", null, DateTime.Now.AddSeconds(), Cache.NoSlidingExpiration, CacheItemPriority.High, onRemove);
    }
// </snippet3>

// <snippet4>
    public void RemoveItemFromCache(Object sender, EventArgs e) {
        if(Cache["Key1"] != null)
          Cache.Remove("Key1");
    }
// </snippet4>
 </Script>
 <body>
  <Form runat="server">
   <input type=submit OnServerClick="AddItemToCache" value="Add Item To Cache" runat="server"/>
   <input type=submit OnServerClick="RemoveItemFromCache" value="Remove Item From Cache" runat="server"/>
  </Form>
  <% if (itemRemoved) {
        Response.Write("RemovedCallback event raised.");
        Response.Write("<BR>");
        Response.Write("Reason: <B>" + reason.ToString() + "</B>");
     }
     else {
// <snippet5>
        Response.Write("Value of cache key: <B>" + Server.HtmlEncode(Cache["Key1"] as string) + "</B>");
// </snippet5>
     }
  %>
 </body>
</html>