using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace JSMachine.WMS.Common.Cache { /// /// 全局内存缓存(需要注意在程序退出时持久化内存数据) /// 什么时候会进行过期缓存清理?特别注意:缓存清理并不会主动进行,即使设置了过期策略也必须在以下几种情况下才清理过期项 /// public class GlobalMemoryCache { /// /// 内存缓存 /// private static IMemoryCache MemoryCache = new MemoryCache(Options.Create(new MemoryCacheOptions() { ExpirationScanFrequency = TimeSpan.FromSeconds(10) })); //默认缓存项缓存过期设置可以绝对过期和滑动过期同时设置,两个条件满足一个即视为当前缓存项过期 //private static MemoryCacheEntryOptions DefaultCachOption = new() //{ // //设置绝对过期时间为10分钟(10分钟后缓存项会移除) // AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30), // //容量为一份大小 // Size = 1, // //设置滑动过期时间为10分钟(两分钟内缓存项未被访问则移除该缓存项) // SlidingExpiration = TimeSpan.FromMinutes(10) //}; /// /// 增加缓存 /// /// /// /// /// /// public static void AddCach(TKey key, TValue value, MemoryCacheEntryOptions memoryCacheEntry = null) { //不传递缓存选项则永不过期 if (memoryCacheEntry == null) MemoryCache.Set(key, value); else MemoryCache.Set(key, value, memoryCacheEntry); } /// /// 获取缓存项 /// /// /// /// /// public static TValue GetCach(TKey key) { return MemoryCache.Get(key); } /// /// 移除缓存项 /// /// /// public static void RemoveCach(TKey key) { MemoryCache.Remove(key); } /// /// 激活缓存,以便让过期项被及时检测并触发超时移除事件 /// 微软限制,当不访问缓存的时候过期策略失效 /// 仅在需要的项目中调用此方法,以免不必要的性能消耗 /// 什么时候会进行过期缓存清理?特别注意:缓存清理并不会主动进行,即使设置了过期策略也必须在以下几种情况下才清理过期项 /// 添加新的 /// 获取缓存项 /// 删除缓存项目 /// public static void ActicateCach() { Task.Run(() => { while (true) { Thread.Sleep(2000); MemoryCache.Get("AAA"); } }); } } }