using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; using System.Web.Caching; namespace SqlSugar.Extensions { public class HttpRuntimeCache : ICacheService { public void Add(string key, V value) { HttpRuntimeCacheHelper.GetInstance().Add(key, value); } public void Add(string key, V value, int cacheDurationInSeconds) { HttpRuntimeCacheHelper.GetInstance().Add(key, value, cacheDurationInSeconds); } public bool ContainsKey(string key) { return HttpRuntimeCacheHelper.GetInstance().ContainsKey(key); } public V Get(string key) { return HttpRuntimeCacheHelper.GetInstance().Get(key); } public IEnumerable GetAllKey() { return HttpRuntimeCacheHelper.GetInstance().GetAllKey(); } public V GetOrCreate(string cacheKey, Func create, int cacheDurationInSeconds = int.MaxValue) { var cacheManager = HttpRuntimeCacheHelper.GetInstance(); if (cacheManager.ContainsKey(cacheKey)) { return cacheManager[cacheKey]; } else { var result = create(); cacheManager.Add(cacheKey, result, cacheDurationInSeconds); return result; } } public void Remove(string key) { HttpRuntimeCacheHelper.GetInstance().Remove(key); } } internal class HttpRuntimeCacheHelper { #region 全局变量 private static HttpRuntimeCacheHelper _instance = null; private static readonly object _instanceLock = new object(); #endregion #region 构造函数 private HttpRuntimeCacheHelper() { } #endregion #region 属性 /// ///根据key获取value /// /// public V this[string key] { get { return (V)HttpRuntime.Cache[CreateKey(key)]; } } #endregion #region 公共函数 /// /// key是否存在 /// /// key /// /// 存在true 不存在false. /// /// public bool ContainsKey(string key) { return HttpRuntime.Cache[CreateKey(key)] != null; } /// /// 获取缓存值 /// /// key /// public V Get(string key) { return (V)HttpRuntime.Cache.Get(CreateKey(key)); } /// /// 获取实例 (单例模式) /// /// public static HttpRuntimeCacheHelper GetInstance() { if (_instance == null) lock (_instanceLock) if (_instance == null) _instance = new HttpRuntimeCacheHelper(); return _instance; } /// /// 插入缓存(默认20分钟) /// /// key /// value public void Add(string key, V value) { Add(key, value, 60 * 20); } /// /// 插入缓存 /// /// key /// value /// 过期时间单位秒 public void Add(string key, V value, int cacheDurationInSeconds) { Add(key, value, cacheDurationInSeconds, CacheItemPriority.Default); } /// /// 插入缓存. /// /// key /// value /// 过期时间单位秒 /// 缓存项属性 public void Add(string key, V value, int cacheDurationInSeconds, CacheItemPriority priority) { string keyString = CreateKey(key); HttpRuntime.Cache.Insert(keyString, value, null, DateTime.Now.AddSeconds(cacheDurationInSeconds), Cache.NoSlidingExpiration, priority, null); } /// /// 插入缓存. /// /// key /// value /// 过期时间单位秒 /// 缓存项属性 public void Add(string key, V value, int cacheDurationInSeconds, CacheDependency dependency, CacheItemPriority priority) { string keyString = CreateKey(key); HttpRuntime.Cache.Insert(keyString, value, dependency, DateTime.Now.AddSeconds(cacheDurationInSeconds), Cache.NoSlidingExpiration, priority, null); } /// /// 删除缓存 /// /// key public void Remove(string key) { HttpRuntime.Cache.Remove(CreateKey(key)); } /// /// 清除所有缓存 /// public void RemoveAll() { 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); } } /// /// 清除所有包含关键字的缓存 /// /// 关键字 public void RemoveAll(Func removeExpression) { System.Web.Caching.Cache _cache = HttpRuntime.Cache; var allKeyList = GetAllKey(); var delKeyList = allKeyList.Where(removeExpression).ToList(); foreach (var key in delKeyList) { HttpRuntime.Cache.Remove(key); ; } } /// /// 获取所有缓存key /// /// public IEnumerable GetAllKey() { IDictionaryEnumerator CacheEnum = HttpRuntime.Cache.GetEnumerator(); while (CacheEnum.MoveNext()) { yield return CacheEnum.Key.ToString(); } } #endregion #region 私有函数 /// ///创建KEY /// /// Key /// private string CreateKey(string key) { return key; } #endregion } }