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()); } } } }