HttpRuntime Cache用法及參數解釋


自己用到的: HttpRuntime.Cache.Insert("SchoolBindKcChangci", SchoolBindKcChangci, null, DateTime.MaxValue, TimeSpan.Zero);

DateTime.MaxValue最大有效時間

存Cache方法:

HttpRuntime.Cache.Add(

       KeyName,//緩存名

       KeyValue,//要緩存的對象

       Dependencies,//依賴項

       AbsoluteExpiration,//絕對過期時間

       SlidingExpiration,//相對過期時間

       Priority,//優先級

       CacheItemRemovedCallback);//緩存過期引發事件

 

示例:

HttpRuntime.Cache.Add("CurrencyFundCodeCache", docs, null, DateTime.Now.AddMinutes(2),  Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);

 

封裝一下:

/// <summary>

        /// 獲得緩存

        /// </summary>

        /// <param name="cacheName"></param>

        /// <returns></returns>

        public static object GetRuntimeCache(string cacheName)

        {

            return HttpRuntime.Cache[cacheName];

        }



        /// <summary>

        /// 更新插入緩存

        /// </summary>

        /// <param name="cacheName"></param>

        /// <param name="value"></param>

        /// <param name="expiresAt"></param>

        public static void SetRuntimeCache(string cacheName, object value, DateTime expiresAt)

        {

             HttpRuntime.Cache.Add(cacheName, value, null, expiresAt,Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);

        }

 

從Cache中取出數據示例:

MongoCursor<BsonDocument> Data = HttpRuntime.Cache["KeyName"] as MongoCursor<BsonDocument>;

判斷Cache中的數據是否已經過期:

if (Data != null)

可以嘗試把cache轉成字典類

lz還沒試過:http://hi.baidu.com/sainaxingxing/item/0620704738289ad6c1a592de

protected void RemoveAllCache() 
    { 
        
       System.Web.Caching.Cache _cache = HttpRuntime.Cache; 
       IDictionaryEnumerator CacheEnum = _cache.GetEnumerator(); 
       ArrayList al = new ArrayList(); 
       while (CacheEnum.MoveNext()) 
       { 
          al.Add(CacheEnum.Key); 
       } 

       foreach (string key in al) 
       { 
          _cache.Remove(key); 
       } 
       show(); 
    } 
//顯示所有緩存 
    void show() 
    { 
       string str = ""; 
       IDictionaryEnumerator CacheEnum = HttpRuntime.Cache.GetEnumerator(); 
        
       while (CacheEnum.MoveNext()) 
       { 
          str += "緩存名<b>[" + CacheEnum.Key+"]</b><br />" ; 
       } 
       this.Label1.Text = "當前網站總緩存數:" + HttpRuntime.Cache.Count +  "<br />"+str; 
    }


二.詳細

System.Web.HttpRuntime.Cache的方法:

Add

Insert

Get

Remove

 

緩存的操作包括:讀、寫。 讀取緩存內容調用System.Web.HttpRuntime.Cache.Get(Key)方法,插入緩存數據調用Add或Insert方法。

 

Add與Insert的不同

HttpRuntime.Cache.Add 存在相同的鍵會異常,返回緩存成功的對象。

HttpRuntime.Cache.Insert存在相同的鍵會替換原值,無返回值。

如果您希望某個緩存項目一旦放入緩存后,就不要再被修改,那么調用Add確實可以防止后來的修改操作。而調用Insert方法,則永遠會覆蓋已存在項。

 

緩存的過期時間

緩存過期時間包括:絕對過期和滑動過期。

絕對過期:到了指定時間以后便會失效。

滑動過期:在指定時間內無訪問請求便失效。

實例:

絕對過期:

HttpRuntime.Cache.Insert(key, value, null, DateTime.Now.AddSeconds(seconds),System.Web.Caching.Cache.NoSlidingExpiration);

滑動過期:

HttpRuntime.Cache.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration , TimeSpan.FromSeconds(seconds));
緩存項移除優先級

// 指定 Cache 對象中存儲的項的相對優先級。
public enum CacheItemPriority { // 在服務器釋放系統內存時,具有該優先級級別的緩存項最有可能被從緩存刪除。 Low = 1, // 在服務器釋放系統內存時,具有該優先級級別的緩存項比分配了 CacheItemPriority.Normal // 優先級的項更有可能被從緩存刪除。 BelowNormal = 2, // 在服務器釋放系統內存時,具有該優先級級別的緩存項很有可能被從緩存刪除, // 其被刪除的可能性僅次於具有 CacheItemPriority.Low // 或 CacheItemPriority.BelowNormal 優先級的那些項。這是默認選項。 Normal = 3, // 緩存項優先級的默認值為 CacheItemPriority.Normal。 Default = 3, // 在服務器釋放系統內存時,具有該優先級級別的緩存項被刪除的可能性 // 比分配了 CacheItemPriority.Normal 優先級的項要小。 AboveNormal = 4, // 在服務器釋放系統內存時,具有該優先級級別的緩存項最不可能被從緩存刪除。 High = 5, // 在服務器釋放系統內存時,具有該優先級級別的緩存項將不會被自動從緩存刪除。 // 但是,具有該優先級級別的項會根據項的絕對到期時間或可調整到期時間與其他項一起被移除。 NotRemovable = 6, } 

三.詳細

1、HttpRuntime.Cache 相當於就是一個緩存具體實現類,這個類雖然被放在了 System.Web 命名空間下了。但是非 Web 應用也是可以拿來用的。

 
        

2、HttpContext.Cache 是對上述緩存類的封裝,由於封裝到了 HttpContext ,局限於只能在知道 HttpContext 下使用,即只能用於 Web 應用。

 
        

綜上所屬,在可以的條件,盡量用 HttpRuntime.Cache ,而不是用 HttpContext.Cache 。

 
        

有以下幾條緩存數據的規則。

 
        

第一,數據可能會被頻繁的被使用,這種數據可以緩存。 第二,數據的訪問頻率非常高,或者一個數據的訪問頻率不高,但是它的生存周期很長,這樣的數據最好也緩存起來。 第三是一個常常被忽略的問題,有時候我們緩存了太多數據,通常在一台X86的機子上,如果你要緩存的數據超過800M的話,就會出現內存溢出的錯誤。所以說緩存是有限的。換名話說,你應該估計緩存集的大小,把緩存集的大小限制在10以內,否則它可能會出問題。在Asp.net中,如果緩存過大的話也會報內存溢出錯誤,特別是如果緩存大的DataSet對象的時候。

 
        

你應該認真分析你的程序。根據實際情況來看哪里該用,哪里不該用。如:cache用得過多也會增大服務器的壓力。整頁輸出緩存,又會影響數據的更新。 如果真的需要緩存很大量的數據,可以考慮靜態技術。

 
        

下面介紹HttpRuntime.Cache常用方法:

using System;

using System.Web;

using System.Collections;

public class CookiesHelper {    

/**//// <summary>    

/// 獲取數據緩存    

/// </summary>    

/// <param name="CacheKey">鍵</param>    

public static object GetCache(string CacheKey)    

{        

System.Web.Caching.Cache objCache = HttpRuntime.Cache;

        return objCache[CacheKey];   

  }

    /**//// <summary>    

/// 設置數據緩存    

/// </summary>    

public static void SetCache(string CacheKey, object objObject)    

{        

System.Web.Caching.Cache objCache = HttpRuntime.Cache;    

     objCache.Insert(CacheKey, objObject);  

   }

    /**//// <summary>    

/// 設置數據緩存    

/// </summary>    

public static void SetCache(string CacheKey, object objObject, TimeSpan Timeout)   

  {        

System.Web.Caching.Cache objCache = HttpRuntime.Cache;   

      objCache.Insert(CacheKey, objObject, null, DateTime.MaxValue, Timeout, System.Web.Caching.CacheItemPriority.NotRemovable, null);     }

    /**//// <summary>    

/// 設置數據緩存    

/// </summary>    

public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration)    

{        

System.Web.Caching.Cache objCache = HttpRuntime.Cache;    

     objCache.Insert(CacheKey, objObject, null, absoluteExpiration, slidingExpiration);    

}

    /**//// <summary>    

/// 移除指定數據緩存    

/// </summary>   

  public static void RemoveAllCache(string CacheKey)    

{        

System.Web.Caching.Cache _cache = HttpRuntime.Cache;     

    _cache.Remove(CacheKey);    

}

    /**//// <summary>   

  /// 移除全部緩存    

/// </summary>    

public static void RemoveAllCache()    

{       

  System.Web.Caching.Cache _cache = HttpRuntime.Cache;   

      IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();     

    while (CacheEnum.MoveNext())        

{          

   _cache.Remove(CacheEnum.Key.ToString());      

   }   

  }

}

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM