using System;
using System.Collections;
using System.Web;
using System.Web.Caching;
namespace CB.Cache.WebCache
{
///
/// 默认的缓存策略类
///
public class WebCache : ICacheStrategy
{
protected static volatile System.Web.Caching.Cache webCache = System.Web.HttpRuntime.Cache;
///
/// 默认缓存存活期为3600秒(1小时)
///
protected int _timeOut = 3600;
//private static object syncObj = new object();
///
/// 构造函数
///
static WebCache() { }
///
/// 设置到期相对时间[单位: 秒]
///
public virtual int TimeOut
{
set { _timeOut = value > 0 ? value : 3600; }
get { return _timeOut > 0 ? _timeOut : 3600; }
}
public static System.Web.Caching.Cache GetWebCacheObj
{
get { return webCache; }
}
///
/// 加入当前对象到缓存中
///
/// 对象的键值
/// 缓存的对象
public virtual void AddObject(string objId, object o)
{
if (objId == null || objId.Length == 0 || o == null)
{
return;
}
webCache.Insert(objId, o, null, DateTime.Now.AddSeconds(TimeOut), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.High, null);
}
///
/// 加入当前对象到缓存中
///
/// 对象的键值
/// 缓存的对象
/// 到期时间,单位:秒
public virtual void AddObject(string objId, object o, int expire)
{
if (objId == null || objId.Length == 0 || o == null)
{
return;
}
//表示永不过期
if (expire == 0)
{
webCache.Insert(objId, o, null, DateTime.MaxValue, TimeSpan.Zero, System.Web.Caching.CacheItemPriority.High, null);
}
else
{
webCache.Insert(objId, o, null, DateTime.Now.AddSeconds(expire), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.High, null);
}
}
///
/// 加入当前对象到缓存中,并对相关文件建立依赖
///
/// 对象的键值
/// 缓存的对象
/// 监视的路径文件
public virtual void AddObjectWithFileChange(string objId, object o, string[] files)
{
if (objId == null || objId.Length == 0 || o == null)
{
return;
}
CacheItemRemovedCallback callBack = new CacheItemRemovedCallback(onRemove);
CacheDependency dep = new CacheDependency(files, DateTime.Now);
webCache.Insert(objId, o, dep, System.DateTime.Now.AddSeconds(TimeOut), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.High, callBack);
}
///
/// 加入当前对象到缓存中,并使用依赖键
///
/// 对象的键值
/// 缓存的对象
/// 依赖关联的键值
public virtual void AddObjectWithDepend(string objId, object o, string[] dependKey)
{
if (objId == null || objId.Length == 0 || o == null)
{
return;
}
CacheItemRemovedCallback callBack = new CacheItemRemovedCallback(onRemove);
CacheDependency dep = new CacheDependency(null, dependKey, DateTime.Now);
webCache.Insert(objId, o, dep, System.DateTime.Now.AddSeconds(TimeOut), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.High, callBack);
}
///
/// 建立回调委托的一个实例
///
///
///
///
public void onRemove(string key, object val, CacheItemRemovedReason reason)
{
switch (reason)
{
case CacheItemRemovedReason.DependencyChanged:
break;
case CacheItemRemovedReason.Expired:
{
//CacheItemRemovedCallback callBack = new CacheItemRemovedCallback(this.onRemove);
//webCache.Insert(key, val, null, System.DateTime.Now.AddMinutes(TimeOut),
// System.Web.Caching.Cache.NoSlidingExpiration,
// System.Web.Caching.CacheItemPriority.High,
// callBack);
break;
}
case CacheItemRemovedReason.Removed:
{
break;
}
case CacheItemRemovedReason.Underused:
{
break;
}
default: break;
}
}
///
/// 删除缓存对象
///
/// 对象的关键字
public virtual void RemoveObject(string objId)
{
if (objId == null || objId.Length == 0)
{
return;
}
webCache.Remove(objId);
}
///
/// 返回一个指定的对象
///
/// 对象的关键字
/// 对象
public virtual object GetObject(string objId)
{
if (objId == null || objId.Length == 0)
{
return null;
}
return webCache.Get(objId);
}
///
/// 清空的有缓存数据
///
public virtual void FlushAll()
{
IDictionaryEnumerator CacheEnum = HttpRuntime.Cache.GetEnumerator();
while (CacheEnum.MoveNext())
{
webCache.Remove(CacheEnum.Key.ToString());
}
}
}
}