ASP.NET/Cache

維基教科書,自由的教學讀本

Cache對象用於在HTTP request間保存頁面或數據。以極大地提高整個應用程序的效率。常用於將頻繁訪問的大量服務器資源存儲在內存中,當用戶發出相同的請求後服務器不再次處理而是將Cache中保存的信息返回給用戶,節省了服務器處理請求的時間。其生存期是應用程序的生存期。當重新啟動應用程序時,將重新創建Cache對象實例。

Application本身就不是線程安全的,而Cache就是線程安全。

System.Web.Caching.Cache類使用比較多的方法和屬性。

  • Add()方法,將指定的對象添加到Cache對象集合中。
  • Insert()方法將覆蓋有相同Key的Cache頂。
  • Remove()從應用程序的Cache對象中移除指定項。
  • Count屬性,獲取存儲在緩存中對象數。

要從Cache中獲取一個緩存項,我們可以調用Cache.Get(key)方法,要將一個對象放入緩存,我們可以調用Add, Insert方法。想簡單地放入緩存,一切接受默認值,那麼還可以調用它的默認索引器

public Object Add(
	string key,
	Object value,
	CacheDependency dependencies,
	DateTime absoluteExpiration,
	TimeSpan slidingExpiration,
	CacheItemPriority priority,
	CacheItemRemovedCallback onRemoveCallback
)

參數:

  • key 用於引用該項的緩存鍵。
  • value 要添加到緩存的項。
  • dependencies 該項的文件依賴項或緩存鍵依賴項。當任何依賴項更改時,該對象即無效,並從緩存中移除。如果沒有依賴項,則此參數包含 nullNothingnullptrnull 引用(在 Visual Basic 中為 Nothing)。
  • absoluteExpiration 所添加對象將到期並被從緩存中移除的時間。如果使用可調到期,則 absoluteExpiration 參數必須為 NoAbsoluteExpiration。
  • slidingExpiration 最後一次訪問所添加對象時與該對象到期時之間的時間間隔。如果該值等效於 20 分鐘,則對象在最後一次被訪問 20 分鐘之後將到期並從緩存中移除。如果使用絕對到期,則 slidingExpiration 參數必須為 NoSlidingExpiration。
  • priority 對象的相對成本,由 CacheItemPriority 枚舉表示。緩存在退出對象時使用該值;具有較低成本的對象在具有較高成本的對象之前被從緩存移除。
  • onRemoveCallback 在從緩存中移除對象時所調用的委託(如果提供)。當從緩存中刪除應用程序的對象時,可使用它來通知應用程序。

備註

  • 如果 Cache 中已保存了具有相同 key 參數的項,則對此方法的調用將失敗。若要使用相同的 key 參數覆蓋現有的 Cache 項,請使用 Insert 方法。
  • 無法同時設置 absoluteExpiration 和 slidingExpiration 參數。如果要讓緩存項在特定時間到期,可將 absoluteExpiration 參數設置為特定時間,並將 slidingExpiration 參數設置為 NoSlidingExpiration。
  • 如果要讓緩存項在最後一次訪問該項後的某段時間之後到期,可將 slidingExpiration 參數設置為到期間隔,並將 absoluteExpiration 參數設置為 NoAbsoluteExpiration。

ASP.NET為了方便訪問Cache,在HttpRuntime類中加了一個靜態屬性Cache,可以在任意地方使用Cache的功能。 ASP.NET還給它增加了二個「快捷方式」:Page.Cache, HttpContext.Cache,通過這二個對象也可以訪問到HttpRuntime.Cache, 注意:這三者是在訪問同一個對象。

// 实现用于 Web 应用程序的缓存。无法继承此类。
public sealed class Cache : IEnumerable
{
    // 用于 Cache.Insert(...) 方法调用中的 absoluteExpiration 参数中以指示项从不过期。
    public static readonly DateTime NoAbsoluteExpiration;

    // 用作 Cache.Insert(...) 或 Cache.Add(...)
    //       方法调用中的 slidingExpiration 参数,以禁用可调过期。
    public static readonly TimeSpan NoSlidingExpiration;


    // 获取或设置指定键处的缓存项。
    public object this[string key] { get; set; }


    // 将指定项添加到 System.Web.Caching.Cache 对象,该对象具有依赖项、过期和优先级策略
    // 以及一个委托(可用于在从 Cache 移除插入项时通知应用程序)。
    public object Add(string key, object value, CacheDependency dependencies,
                        DateTime absoluteExpiration, TimeSpan slidingExpiration,
                        CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);


    // 从 System.Web.Caching.Cache 对象检索指定项。
    // key: 要检索的缓存项的标识符。
    // 返回结果: 检索到的缓存项,未找到该键时为 null。
    public object Get(string key);


    public void Insert(string key, object value);
    public void Insert(string key, object value, CacheDependency dependencies);
    public void Insert(string key, object value, CacheDependency dependencies,
                                    DateTime absoluteExpiration, TimeSpan slidingExpiration);

    // 摘要:
    //     向 System.Web.Caching.Cache 对象中插入对象,后者具有依赖项、过期和优先级策略
    //        以及一个委托(可用于在从 Cache 移除插入项时通知应用程序)。
    //
    // 参数:
    //   key:
    //     用于引用该对象的缓存键。
    //
    //   value:
    //     要插入缓存中的对象。
    //
    //   dependencies:
    //     该项的文件依赖项或缓存键依赖项。当任何依赖项更改时,该对象即无效,
    //            并从缓存中移除。如果没有依赖项,则此参数包含 null。
    //
    //   absoluteExpiration:
    //     所插入对象将过期并被从缓存中移除的时间。
    //        如果使用绝对过期,则 slidingExpiration 参数必须为 Cache.NoSlidingExpiration。
    //
    //   slidingExpiration:
    //     最后一次访问所插入对象时与该对象过期时之间的时间间隔。如果该值等效于 20 分钟,
    //       则对象在最后一次被访问 20 分钟之后将过期并被从缓存中移除。如果使用可调过期,则
    //     absoluteExpiration 参数必须为 System.Web.Caching.Cache.NoAbsoluteExpiration。
    //
    //   priority:
    //     该对象相对于缓存中存储的其他项的成本,由 System.Web.Caching.CacheItemPriority 枚举表示。
    //       该值由缓存在退出对象时使用;具有较低成本的对象在具有较高成本的对象之前被从缓存移除。
    //
    //   onRemoveCallback:
    //     在从缓存中移除对象时将调用的委托(如果提供)。
    //            当从缓存中删除应用程序的对象时,可使用它来通知应用程序。
    //
    // 异常:
    //   System.ArgumentException:
    //     为要添加到 Cache 中的项设置 absoluteExpiration 和 slidingExpiration 参数。
    //
    //   System.ArgumentNullException:
    //     key 或 value 参数为 null。
    //
    //   System.ArgumentOutOfRangeException:
    //     将 slidingExpiration 参数设置为小于 TimeSpan.Zero 或大于一年的等效值。
    public void Insert(string key, object value, CacheDependency dependencies,
                        DateTime absoluteExpiration, TimeSpan slidingExpiration,
                        CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);

    // 从应用程序的 System.Web.Caching.Cache 对象移除指定项。
    public object Remove(string key);

    // 将对象与依赖项策略、到期策略和优先级策略
    // 以及可用来在从缓存中移除项【之前】通知应用程序的委托一起插入到 Cache 对象中。
    // 注意:此方法受以下版本支持:3.5 SP1、3.0 SP1、2.0 SP1
    public void Insert(string key, object value, CacheDependency dependencies,
                            DateTime absoluteExpiration, TimeSpan slidingExpiration,
                            CacheItemUpdateCallback onUpdateCallback);
}

例如:

  //存放信息
  Cache["nameID"]="0001";
  //存放信息
  Cache.Insert("nameID","0001"1);
  //读取信息
  string NameID=Cache["nameID"].ToString();


DateTime now = DateTime.Now;
            string cachedString = (string)HttpContext.Cache["Now"];
            if (string.IsNullOrEmpty(cachedString))
            {
                cachedString = now.ToString();
                HttpContext.Cache.Insert("Now", now.ToString(), null, DateTime.Now.AddMinutes(1), Cache.NoSlidingExpiration,
                      System.Web.Caching.CacheItemPriority.NotRemovable,
                     new System.Web.Caching.CacheItemRemovedCallback(OnMoveCacheBack)//移除时调用的回调函数
                );
            }

   private void OnMoveCacheBack(string key, object value, CacheItemRemovedReason reason)
        {
            DateTime now = DateTime.Now;
            string cachedString = (string)HttpContext.Cache[key];
            if (!string.IsNullOrEmpty(cachedString))
            {
                HttpContext.Cache.Remove(key);
            }
            HttpContext.Cache.Insert("Now", now.ToString(), null, DateTime.Now.AddMinutes(1), Cache.NoSlidingExpiration,
                   System.Web.Caching.CacheItemPriority.NotRemovable,
                  new System.Web.Caching.CacheItemRemovedCallback(OnMoveCacheBack)//移除时调用的回调函数
             );
        }