配置文件
<add key="EnableCache" value="true"/>
<add key="CacheDurationSeconds" value="300"/>
</appSettings>
操作方法
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(0, 0, cacheDurationSeconds),
System.Web.Caching.CacheItemPriority.High,
null);
}
}
}
使用方法
if (strCache1 == null)
{
Response.Write("<p>Cache is empty</p>");
strCache1 = "OK";
SiteHelper.SetCache("Cache1", strCache1, 30);
}
Response.Write(strCache1);
常见问题#Cache显示与清空问题
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.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,而不直接操作枚举数。
枚举数可用于读取集合中的数据,但不能用于修改基础集合。
最初,枚举数定位在集合中第一个元素前。Reset 方法还会将枚举数返回到此位置。在此位置,调用 Current 属性会引发异常。因此,在读取 Current 的值之前,必须调用 MoveNext 方法将枚举数提前到集合的第一个元素。
在调用 MoveNext 或 Reset 之前,Current 返回同一个对象。MoveNext 将 Current 设置为下一个元素。
如果 MoveNext 越过集合的末尾,则枚举数将放置在集合中最后一个元素的后面,而且 MoveNext 返回 false。当枚举数位于此位置时,对 MoveNext 的后续调用也返回 false。如果最后一次调用 MoveNext 返回 false,则调用 Current 会引发异常。若要再次将 Current 设置为集合的第一个元素,可以调用 Reset,然后再调用 MoveNext。
只要该集合保持不变,枚举数也就保持有效。如果对集合进行了更改(如添加、修改或删除元素),则枚举数将失效且不可恢复,并且下一次对 MoveNext 或 Reset 的调用将引发 InvalidOperationException。如果在 MoveNext 和 Current 之间修改集合,那么即使枚举数已经无效,Current 也将返回它所设置成的元素。
枚举数没有对集合的独占访问权;因此,从头到尾对一个集合进行枚举在本质上不是一个线程安全的过程。即使某个集合已同步,其他线程仍可以修改该集合,这会导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。
大中型Cache应用推荐:Velocity,memcached等