1 public class CacheHeloer 2 { 3 4 /// <summary> 5 /// 默认缓存 6 /// </summary> 7 private static CacheHeloer Default { get { return new CacheHeloer(); } } 8 9 /// <summary> 10 /// 缓存初始化 11 /// </summary> 12 private MemoryCache cache = MemoryCache.Default; 13 14 /// <summary> 15 /// 锁 16 /// </summary> 17 private object locker = new object(); 18 19 /// <summary> 20 /// 构造器 21 /// </summary> 22 private CacheHeloer() 23 { 24 //CacheItemPolicy policy = new CacheItemPolicy(); //创建缓存项策略 25 ////过期时间设置,以下两种只能设置一种 26 //policy.AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddMinutes(5)); //设定某个时间过后将逐出缓存 27 //policy.SlidingExpiration = new TimeSpan(0, 0, 10); //设定某个时间段内未被访问将逐出缓存 28 ////逐出通知,以下两种只能设置一种 29 //policy.UpdateCallback = arguments => { Console.WriteLine("即将逐出缓存" + arguments.Key); }; 30 } 31 32 /// <summary> 33 /// 从缓存中获取对象 34 /// </summary> 35 /// <typeparam name="T">对象类型</typeparam> 36 /// <param name="key">键</param> 37 /// <returns>缓存对象</returns> 38 public static object Get(string key) 39 { 40 return Default.GetFromCache(key); 41 } 42 43 /// <summary> 44 /// 从缓存中获取对象 45 /// </summary> 46 /// <typeparam name="T">对象类型</typeparam> 47 /// <param name="key">键</param> 48 /// <returns>缓存对象</returns> 49 private object GetFromCache(string key) 50 { 51 lock (locker) 52 { 53 if (cache.Contains(key)) 54 { 55 return cache[key]; 56 } 57 return null; 58 } 59 } 60 61 /// <summary> 62 /// 设置缓存指定时间未访问过期 63 /// </summary> 64 /// <typeparam name="T">对象</typeparam> 65 /// <param name="key">键</param> 66 /// <param name="value">数据对象</param> 67 /// <param name="expire">过期时间</param> 68 public static bool Set(string key, Object value, TimeSpan expiresIn) 69 { 70 var policy = new CacheItemPolicy() 71 { 72 SlidingExpiration = expiresIn 73 }; 74 return Default.SetToCache(key, value, policy); 75 } 76 /// <summary> 77 /// 设置缓存绝对时间过期 78 /// </summary> 79 /// <typeparam name="T"></typeparam> 80 /// <param name="key"></param> 81 /// <param name="value"></param> 82 /// <param name="expiresIn"></param> 83 /// <returns></returns> 84 public static bool Set(string key, Object value, DateTimeOffset expiresIn) 85 { 86 var policy = new CacheItemPolicy() 87 { 88 AbsoluteExpiration = expiresIn 89 }; 90 return Default.SetToCache(key, value, policy); 91 } 92 93 /// <summary> 94 /// 添加到缓存 95 /// </summary> 96 /// <typeparam name="T">缓存对象类型</typeparam> 97 /// <param name="key">键</param> 98 /// <param name="value">值</param> 99 /// <returns>结果状态</returns> 100 public static bool Set(string key, object value) 101 { 102 CacheItemPolicy policy = new CacheItemPolicy() 103 { 104 Priority = CacheItemPriority.NotRemovable, 105 }; 106 return Default.SetToCache(key, value, policy); 107 } 108 109 /// <summary> 110 /// 数据对象装箱缓存 111 /// </summary> 112 /// <typeparam name="T">对象</typeparam> 113 /// <param name="key">键</param> 114 /// <param name="value">数据对象</param> 115 /// <param name="expire">过期时间</param> 116 private bool SetToCache(string key, object value, CacheItemPolicy policy) 117 { 118 lock (locker) 119 { 120 cache.Set(key, value, policy); 121 return true; 122 } 123 } 124 125 /// <summary> 126 /// 获取键的集合 127 /// </summary> 128 /// <returns>键的集合</returns> 129 public static ICollection<string> Keys() 130 { 131 return Default.GetCacheKeys(); 132 } 133 134 /// <summary> 135 /// 获取键的集合 136 /// </summary> 137 /// <returns>键的集合</returns> 138 private ICollection<string> GetCacheKeys() 139 { 140 lock (locker) 141 { 142 IEnumerable<KeyValuePair<string, object>> items = cache.AsEnumerable(); 143 return items.Select(m => m.Key).ToList(); 144 } 145 } 146 147 /// <summary> 148 /// 判断缓存中是否有此对象 149 /// </summary> 150 /// <param name="key">键</param> 151 /// <returns>是否存在</returns> 152 public static bool Contain(string key) 153 { 154 return Default.ContainKey(key); 155 } 156 157 /// <summary> 158 /// 判断缓存中是否有此对象 159 /// </summary> 160 /// <param name="key">键</param> 161 /// <returns>是否存在</returns> 162 private bool ContainKey(string key) 163 { 164 lock (locker) 165 { 166 return cache.Contains(key); 167 } 168 } 169 170 /// <summary> 171 /// 数据对象从缓存对象中移除 172 /// </summary> 173 /// <param name="key">键</param> 174 public static bool Remove(string key) 175 { 176 return Default.RemoveFromCache(key); 177 } 178 179 /// <summary> 180 /// 数据对象从缓存对象中移除 181 /// </summary> 182 /// <param name="key">键</param> 183 private bool RemoveFromCache(string key) 184 { 185 lock (locker) 186 { 187 if (cache.Contains(key)) 188 { 189 cache.Remove(key); 190 return true; 191 } 192 return false; 193 } 194 } 195 196 /// <summary> 197 /// 清除实例 198 /// </summary> 199 public static void Clear() 200 { 201 Default.ClearCache(); 202 } 203 204 /// <summary> 205 /// 清除实例 206 /// </summary> 207 private void ClearCache() 208 { 209 lock (locker) 210 { 211 cache.ToList().ForEach(m => cache.Remove(m.Key)); 212 } 213 } 214 215 /// <summary> 216 /// 获取缓存对象集合 217 /// </summary> 218 /// <typeparam name="T">缓存对象类型</typeparam> 219 /// <returns>缓存对象集合</returns> 220 public static ICollection<T> Values<T>() 221 { 222 return Default.GetValues<T>(); 223 } 224 225 /// <summary> 226 /// 获取缓存对象集合 227 /// </summary> 228 /// <typeparam name="T">缓存对象类型</typeparam> 229 /// <returns>缓存对象集合</returns> 230 private ICollection<T> GetValues<T>() 231 { 232 lock (locker) 233 { 234 IEnumerable<KeyValuePair<string, object>> items = cache.AsEnumerable(); 235 return items.Select(m => (T)m.Value).ToList(); 236 } 237 } 238 239 /// <summary> 240 /// 获取缓存尺寸 241 /// </summary> 242 /// <returns>缓存尺寸</returns> 243 public static long Size() 244 { 245 return Default.GetCacheSize(); 246 } 247 248 /// <summary> 249 /// 获取缓存尺寸 250 /// </summary> 251 /// <returns>缓存尺寸</returns> 252 private long GetCacheSize() 253 { 254 lock (locker) 255 { 256 return cache.GetCount(); 257 } 258 } 259 }