using Microsoft.Extensions.Caching.Memory; using System; using System.Collections.Generic; using System.Collections; using System.Reflection; namespace Common { public class CacheHelper { public static MemoryCache Cache { get; set; } static CacheHelper() { Cache = new MemoryCache(new MemoryCacheOptions { //SizeLimit = 1024 }); } /// /// 获取缓存 /// /// /// /// public static T GetCache(string key) where T : class { if (key == null) throw new ArgumentNullException(nameof(key)); //return Cache.Get(key) as T; //或者 return Cache.Get(key); } /// /// 获取缓存 /// /// /// public static object GetCache(string CacheKey) { return Cache.Get(CacheKey); } public static object Get(string CacheKey) { return Cache.Get(CacheKey); } /// /// 设置缓存,永久缓存 /// /// key /// 值 public static object SetCache(string CacheKey, object objObject) { return Cache.Set(CacheKey, objObject); } /// /// 设置缓存 /// /// key /// 值 /// 过期时间(分钟) public static object SetCache(string CacheKey, object objObject, int Timeout) { return Cache.Set(CacheKey, objObject, DateTime.Now.AddMinutes(Timeout)); } /// /// 设置缓存(秒) /// /// key /// 值 /// 过期时间(秒) public static void SetCaches(string CacheKey, object objObject, int Timeout) { Cache.Set(CacheKey, objObject, DateTime.Now.AddSeconds(Timeout)); } /// /// 设置缓存 /// /// key /// 值 /// 过期时间 /// 过期时间间隔 public static object SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration) { return Cache.Set(CacheKey, objObject, absoluteExpiration); } /// /// 设定绝对的过期时间 /// /// /// /// 超过多少秒后过期 public static void SetCacheDateTime(string CacheKey, object objObject, long Seconds) { Cache.Set(CacheKey, objObject, DateTime.Now.AddSeconds(Seconds)); } /// /// 删除缓存 /// /// key public static void Remove(string key) { Cache.Remove(key); } /// /// 验证缓存项是否存在 /// /// 缓存Key /// public static bool Exists(string key) { if (key == null) throw new ArgumentNullException(nameof(key)); return Cache.TryGetValue(key, out _); } /// /// 获取所有缓存键 /// /// public static List GetCacheKeys() { const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic; //var entries = Cache.GetType().GetField("_entries", flags).GetValue(Cache); //.net7需要这样写 var coherentState = Cache.GetType().GetField("_coherentState", flags).GetValue(Cache); var entries = coherentState.GetType().GetField("_entries", flags).GetValue(coherentState); var keys = new List(); if (entries is not IDictionary cacheItems) return keys; foreach (DictionaryEntry cacheItem in cacheItems) { keys.Add(cacheItem.Key.ToString()); //Console.WriteLine("缓存key=" +cacheItem.Key); } return keys; } } }