配置文件

<appSettings>
  
<add key="EnableCache" value="true"/>
  
<add key="CacheDurationSeconds" value="300"/>
</appSettings>

操作方法

 

代码
using System;
using System.Web.Configuration;

public class SiteHelper
{
    
static public object GetCache(string CacheId)
    {
        
object objCache = System.Web.HttpRuntime.Cache.Get(CacheId);

        
// 判斷 Cache 是否啟用
        if (WebConfigurationManager.AppSettings["EnableCache"== null
            
|| !Convert.ToBoolean(WebConfigurationManager.AppSettings["EnableCache"]))
        {
            objCache 
= null;
            System.Web.HttpRuntime.Cache.Remove(CacheId);
        }

        
return objCache;
    }

    
/// <summary>
    
/// 寫入 Cache 資料 ( 預設 60 秒 )
    
/// </summary>
    
/// <param name="CacheId"></param>
    
/// <param name="objCache"></param>
    static public void SetCache(string CacheId, object objCache)
    {
        
if (WebConfigurationManager.AppSettings["CacheDurationSeconds"!= null)
        {
            SetCache(CacheId, objCache, 
                Convert.ToInt32(WebConfigurationManager.AppSettings[
"CacheDurationSeconds"]));
        }
        
else
        {
            SetCache(CacheId, objCache, 
60);
        }
    }

    
static public void SetCache(string CacheId, object objCache, int cacheDurationSeconds)
    {
        
if (objCache != null)
        {
            System.Web.HttpRuntime.Cache.Insert(
                CacheId,
                objCache,
                
null,
                System.Web.Caching.Cache.NoAbsoluteExpiration,
                
new TimeSpan(00, cacheDurationSeconds),
                System.Web.Caching.CacheItemPriority.High,
                
null);
        }
    }
}

使用方法

代码
string strCache1 = SiteHelper.GetCache("Cache1"as string;

if (strCache1 == null)
{
    Response.Write(
"<p>Cache is empty</p>");

    strCache1 
= "OK";
    SiteHelper.SetCache(
"Cache1", strCache1, 30);
}

Response.Write(strCache1);

 常见问题#Cache显示与清空问题

代码
List<string> cacheKeys = new List<string>();
IDictionaryEnumerator cacheEnum 
= Cache.GetEnumerator();
while (cacheEnum.MoveNext())
{
    cacheKeys.Add(cacheEnum.Key.ToString());
}
foreach (string cacheKey in cacheKeys)
{
    Cache.Remove(cacheKey);
}
代码
    //清除所有缓存
    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;
    }

添加到扩展方法

代码
using System;
using System.Web.Caching;
using System.Collections;
using System.Collections.Generic;

/// <summary>
/// 擴充 System.Web.Caching 命名空間的 Extension Methods
/// </summary>
static public class CacheExtensionMethod
{
    
public static void Clear(this Cache x)
    {
        List
<string> cacheKeys = new List<string>();
        IDictionaryEnumerator cacheEnum 
= x.GetEnumerator();
        
while (cacheEnum.MoveNext())
        {
            cacheKeys.Add(cacheEnum.Key.ToString());
        }
        
foreach (string cacheKey in cacheKeys)
        {
            x.Remove(cacheKey);
        }
    }
}

MSDN

C# 语言的 foreach 语句(在 Visual Basic 中为 for each)隐藏了枚举数的复杂性。因此,建议使用 foreach,而不直接操作枚举数。

枚举数可用于读取集合中的数据,但不能用于修改基础集合。

最初,枚举数定位在集合中第一个元素前。MoveNext 方法将枚举数提前到集合的第一个元素。

在调用 Current 设置为下一个元素。

如果 MoveNext

只要该集合保持不变,枚举数也就保持有效。如果对集合进行了更改(如添加、修改或删除元素),则枚举数将失效且不可恢复,并且下一次对 Current 也将返回它所设置成的元素。

枚举数没有对集合的独占访问权;因此,从头到尾对一个集合进行枚举在本质上不是一个线程安全的过程。即使某个集合已同步,其他线程仍可以修改该集合,这会导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。

 

大中型Cache应用推荐:Velocity,memcached等

相关文章: