1. 程式人生 > >C#快取介紹 Caching通用幫助類程式碼整理 .net幾種快取概述

C#快取介紹 Caching通用幫助類程式碼整理 .net幾種快取概述

Cache的概述及用法和幫助類:

  Cache 即快取記憶體.那麼cache是怎麼樣提高系統性能與執行速度呢?是不是在任何情況下用cache都能提高效能?是不是cache用的越多就越好呢?
  Cache 是怎麼樣工作的?
Cache 是分配在伺服器上的一個公共的記憶體片。
所謂公共指的cache只要一建立是任何一個客戶端瀏覽器都可以通過後臺程式碼訪問到它,它面向的是所有使用者,相對而言session也是伺服器上的一 段記憶體,但他面向的是單個使用者。它是伺服器的一段記憶體塊,也就是說每個cache一經建立就佔用了伺服器資源的。所以從這點來說我們就可以說:並不是 cache越多越好。  
cache 是有時間限制的,超過了伺服器設定的過期時間,它就會被伺服器回收。


  cache 可以存放任何物件

Cache支援裝箱/拆箱操作。如你可以把一個DataSet物件ds通過Cache.Insert(“dsCache”,ds)的方式存到Cache中,可以通過拆箱操作 DataSet ds = (DataSet)Cache[“dsCache”]來訪問它。

 Cache 一般用於資料較固定,用的較頻繁的地方。

    Cache是有時間限制的。超過了伺服器設定的過期時間,就會被伺服器回收。當cache被回收後對應的記憶體塊就會被清空,再次通過cache[“cachekey”]訪問物件時返回的就是null值。

web站點中快取的重要性毋庸置疑。我想很多.net開發人員在開發web應用系統的時候優先考慮使用的快取並不是第三方快取解決方案(比如 分散式快取memcached、redis等等),而應該是.net framework已經提供的多種快取解決方案。下面談談對.net framework中快取的認識。

1、System.Web.Caching.Cache

估計大部分做過asp.net開發的人都用過這個名稱空間下的快取,我們可以直接使用HttpContext.Current.Cache例項而不 用例項化。當然這個名稱空間下的Cache類是允許您例項化的,需要定製自己的快取系統的當然可以完全自己控制如何初始化這個類。我在園子裡看到過有很多 文章介紹Cache的CRUD輔助類庫大多數都是針對System.Web.Caching.Cache。

需要說明的是,我們還可以通過該名稱空間下的HttpRuntime.Cache實現web、控制檯、winform等不同表現形式下的快取,而且 完全無需自己例項化。HttpRuntime.Cache是之前個人開發中使用比較多的一個類,現在比較偏愛.net framework4.0中的增強型的快取類MemoryCache。

2、Output Cache

眾所周知,輸出快取主要分頁面輸出快取和頁面部分快取。說白了,就是快取整個頁面的html或者部分html,沒什麼值得討論的。

3、System.Runtime.Caching

現在開發中使用最多的類MemoryCache出自這個名稱空間,使用前需要引用using System.Runtime.Caching。MemoryCache繼承自ObjectCache, IEnumerable, IDisposable,其中ObjectCache是個抽象類。用過MemoryCache的人都知道,這個MemoryCache有一個屬性叫 Default,通常可以像下面這樣使用:

private static ObjectCache memCache = MemoryCache.Default;
當然我們也完全可以通過public MemoryCache(string name, NameValueCollection config = null)建構函式初始化快取物件。

接著我們可以在web.config檔案中配置每個MemoryCache例項執行的記憶體使用配額方案和配額檢查週期,下面示例參考MSDN:

<system.runtime.caching>
<memoryCache>
<namedCaches>
<add name=”Default” cacheMemoryLimitMegabytes=”10″ pollingInterval=”00:02:00″/>
</namedCaches>
</memoryCache>
</system.runtime.caching>

這些配置意義在於可以明確指定每個MemoryCache例項執行的記憶體使用配額方案和配額檢查週期。比如我們可以通過配置來按需更改 MemoryCache.Default例項的記憶體配額(不知道快取可用最大記憶體是多少,可能還是傳說中的800M左右)。快取過期策略與其它的快取框架 大同小異,與System.Web.Caching.Cache的不同只是名稱不叫CacheDependency,而叫ChangeMonitor,並且提供了基於檔案和目錄的快取依賴策略。關於快取過期策略也比較有探討的必要,不過個人開發中比較偏重於資料快取和替換,目前還沒有接觸和使用過比較完美的過期策略解決方案。

以下是幫助類:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Caching;
using System.Web.Hosting;
namespace ECS.Utility
{
/// <summary>
/// Caching 的摘要說明
/// </summary>
public class CacheHelper 
{

/// <summary>
/// 獲取當前應用程式指定CacheKey的Cache值
/// </summary>
/// <param name="CacheKey">
/// <returns></returns>y
public static object GetCache(string CacheKey)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
return objCache[CacheKey];
}

/// <summary>
/// 設定當前應用程式指定CacheKey的Cache值
/// </summary>
/// <param name="CacheKey">
/// <param name="objObject">
public static void SetCache(string CacheKey, object objObject)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(CacheKey, objObject);
}


/// <summary>
/// 設定當前應用程式指定CacheKey的Cache值
/// </summary>
/// <param name="CacheKey">
/// <param name="objObject">
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 SetCache(string CacheKey, object objObject, int timeout = 7200)  
      {  
          try  
         {  
              if (objObject == null) return;  
              var objCache = HttpRuntime.Cache;  
             //相對過期  
             //objCache.Insert(cacheKey, objObject, null, DateTime.MaxValue, timeout, CacheItemPriority.NotRemovable, null);  
              //絕對過期時間  
             objCache.Insert(cacheKey, objObject, null, DateTime.Now.AddSeconds(timeout), TimeSpan.Zero, CacheItemPriority.High, null);  
          }  
          catch (Exception)  
          {  
            //throw;  
          }  
      } 
/// <summary>
/// 清除單一鍵快取
/// </summary>
/// <param name="key">
public static void RemoveKeyCache(string CacheKey)
{
try
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Remove(CacheKey);
}
catch { }
}

/// <summary>
/// 清除所有快取
/// </summary>
public static void RemoveAllCache()
{
System.Web.Caching.Cache _cache = HttpRuntime.Cache;
IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
if (_cache.Count > 0)
{
ArrayList al = new ArrayList();
while (CacheEnum.MoveNext())
{
al.Add(CacheEnum.Key);
}
foreach (string key in al)
{
_cache.Remove(key);
}
}
}
/// <summary>  
    /// 清除所有快取
    /// </summary>  
    public static void RemoveAllCache()  
    {  
        var cache = HttpRuntime.Cache;  
        var cacheEnum = cache.GetEnumerator();  
        while (cacheEnum.MoveNext())  
        {  
            cache.Remove(cacheEnum.Key.ToString());  
        }  
    } 
/// <summary>
/// 以列表形式返回已存在的所有快取 
/// </summary>
/// <returns></returns> 
public static ArrayList ShowAllCache()
{
ArrayList al = new ArrayList();
System.Web.Caching.Cache _cache = HttpRuntime.Cache;
if (_cache.Count > 0)
{
IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
while (CacheEnum.MoveNext())
{
al.Add(CacheEnum.Key);
}
}
return al;
}


}
}


  

C#快取主要是為了提高資料的讀取速度。因為伺服器和應用客戶端之間存在著流量的瓶頸,所以讀取大容量資料時,使用快取來直接為客戶端服務,可以減少客戶端與伺服器端的資料互動,從而大大提高程式的效能。

cache與session,cookie的區別:

session把資料儲存在伺服器端,每一個使用者都有屬於自己的Session,與別人的不衝突
就是說,你登陸系統後,你的資訊(如賬號、密碼等)就會被儲存在伺服器上一個單獨的session中,當你退出系統後伺服器就會丟掉這個session,你的資料也就沒了,必須再次登陸,如果登陸超時也會被丟掉,要看人家系統是怎麼設定的了
Cookie同session一樣是儲存你個人資訊的,不過是儲存在客戶端,也就是你使用的電腦上,並且不會被丟掉,除非你刪除瀏覽器Cookie
Cache是儲存系統上的資訊的,因為從Cache中讀資料比較快,有些系統(網站)會把一些經常被使用的資料放到Cache裡,提高訪問速度,優化系統性能 
session和cookie是面向單個使用者的,cache是面向的是所有使用者。
End。。。