在Core中不能使用原HttpRuntime.Cache緩存,改為MemoryCache(Microsoft.Extensions.Caching.Memory). 現MemoryCache新版為2.0.1,於原HttpRuntime.Cache擴展方法基本相同,但裡面沒有查詢全部鍵(key) 的擴 ...
在Core中不能使用原HttpRuntime.Cache緩存,改為MemoryCache(Microsoft.Extensions.Caching.Memory).
現MemoryCache新版為2.0.1,於原HttpRuntime.Cache擴展方法基本相同,但裡面沒有查詢全部鍵(key) 的擴展,要想查詢可通過反射查找
代碼如下:
public List<string> GetCacheKeys() { const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic; var entries = Cache.GetType().GetField("_entries", flags).GetValue(Cache); var cacheItems = entries as IDictionary; var keys = new List<string>(); if (cacheItems == null) return keys; foreach (DictionaryEntry cacheItem in cacheItems) { keys.Add(cacheItem.Key.ToString()); } return keys; }
這樣我們就能獲取到全部的鍵.
整體MemoryCacheHelper類如下:
public class MemoryCacheHelper { private static readonly MemoryCache Cache = new MemoryCache(new MemoryCacheOptions()); /// <summary> /// 驗證緩存項是否存在 /// </summary> /// <param name="key">緩存Key</param> /// <returns></returns> public bool Exists(string key) { if (key == null) throw new ArgumentNullException(nameof(key)); return Cache.TryGetValue(key, out _); } /// <summary> /// 添加緩存 /// </summary> /// <param name="key">緩存Key</param> /// <param name="value">緩存Value</param> /// <param name="expiresSliding">滑動過期時長(如果在過期時間內有操作,則以當前時間點延長過期時間)</param> /// <param name="expiressAbsoulte">絕對過期時長</param> /// <returns></returns> public bool Set(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte) { if (key == null) throw new ArgumentNullException(nameof(key)); if (value == null) throw new ArgumentNullException(nameof(value)); Cache.Set(key, value, new MemoryCacheEntryOptions().SetSlidingExpiration(expiresSliding) .SetAbsoluteExpiration(expiressAbsoulte)); return Exists(key); } /// <summary> /// 添加緩存 /// </summary> /// <param name="key">緩存Key</param> /// <param name="value">緩存Value</param> /// <param name="expiresIn">緩存時長</param> /// <param name="isSliding">是否滑動過期(如果在過期時間內有操作,則以當前時間點延長過期時間)</param> /// <returns></returns> public bool Set(string key, object value, TimeSpan expiresIn, bool isSliding = false) { if (key == null) throw new ArgumentNullException(nameof(key)); if (value == null) throw new ArgumentNullException(nameof(value)); Cache.Set(key, value, isSliding ? new MemoryCacheEntryOptions().SetSlidingExpiration(expiresIn) : new MemoryCacheEntryOptions().SetAbsoluteExpiration(expiresIn)); return Exists(key); } #region 刪除緩存 /// <summary> /// 刪除緩存 /// </summary> /// <param name="key">緩存Key</param> /// <returns></returns> public void Remove(string key) { if (key == null) throw new ArgumentNullException(nameof(key)); Cache.Remove(key); } /// <summary> /// 批量刪除緩存 /// </summary> /// <returns></returns> public void RemoveAll(IEnumerable<string> keys) { if (keys == null) throw new ArgumentNullException(nameof(keys)); keys.ToList().ForEach(item => Cache.Remove(item)); } #endregion #region 獲取緩存 /// <summary> /// 獲取緩存 /// </summary> /// <param name="key">緩存Key</param> /// <returns></returns> public T Get<T>(string key) where T : class { if (key == null) throw new ArgumentNullException(nameof(key)); return Cache.Get(key) as T; } /// <summary> /// 獲取緩存 /// </summary> /// <param name="key">緩存Key</param> /// <returns></returns> public object Get(string key) { if (key == null) throw new ArgumentNullException(nameof(key)); return Cache.Get(key); } /// <summary> /// 獲取緩存集合 /// </summary> /// <param name="keys">緩存Key集合</param> /// <returns></returns> public IDictionary<string, object> GetAll(IEnumerable<string> keys) { if (keys == null) throw new ArgumentNullException(nameof(keys)); var dict = new Dictionary<string, object>(); keys.ToList().ForEach(item => dict.Add(item, Cache.Get(item))); return dict; } #endregion /// <summary> /// 刪除所有緩存 /// </summary> public void RemoveCacheAll() { var l = GetCacheKeys(); foreach (var s in l) { Remove(s); } } /// <summary> /// 刪除匹配到的緩存 /// </summary> /// <param name="pattern"></param> /// <returns></returns> public void RemoveCacheRegex(string pattern) { IList<string> l = SearchCacheRegex(pattern); foreach (var s in l) { Remove(s); } } /// <summary> /// 搜索 匹配到的緩存 /// </summary> /// <param name="pattern"></param> /// <returns></returns> public IList<string> SearchCacheRegex(string pattern) { var cacheKeys = GetCacheKeys(); var l = cacheKeys.Where(k => Regex.IsMatch(k, pattern)).ToList(); return l.AsReadOnly(); } /// <summary> /// 獲取所有緩存鍵 /// </summary> /// <returns></returns> public List<string> GetCacheKeys() { const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic; var entries = Cache.GetType().GetField("_entries", flags).GetValue(Cache); var cacheItems = entries as IDictionary; var keys = new List<string>(); if (cacheItems == null) return keys; foreach (DictionaryEntry cacheItem in cacheItems) { keys.Add(cacheItem.Key.ToString()); } return keys; } }MemoryCacheHelper
Startup.cs文件public void ConfigureServices(IServiceCollection services)方法註冊MemoryCache
services.AddMemoryCache();