Files
2026-09-02 16:31:50 +08:00

97 lines
3.5 KiB
C#

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
{
/// <summary>
/// 全局内存缓存(需要注意在程序退出时持久化内存数据)
/// 什么时候会进行过期缓存清理?特别注意:缓存清理并不会主动进行,即使设置了过期策略也必须在以下几种情况下才清理过期项
/// </summary>
public class GlobalMemoryCache
{
/// <summary>
/// 内存缓存
/// </summary>
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)
//};
/// <summary>
/// 增加缓存
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="memoryCacheEntry"></param>
public static void AddCach<TKey, TValue>(TKey key, TValue value, MemoryCacheEntryOptions memoryCacheEntry = null)
{
//不传递缓存选项则永不过期
if (memoryCacheEntry == null)
MemoryCache.Set(key, value);
else
MemoryCache.Set(key, value, memoryCacheEntry);
}
/// <summary>
/// 获取缓存项
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public static TValue GetCach<TKey, TValue>(TKey key)
{
return MemoryCache.Get<TValue>(key);
}
/// <summary>
/// 移除缓存项
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="key"></param>
public static void RemoveCach<TKey>(TKey key)
{
MemoryCache.Remove(key);
}
/// <summary>
/// 激活缓存,以便让过期项被及时检测并触发超时移除事件
/// 微软限制,当不访问缓存的时候过期策略失效
/// 仅在需要的项目中调用此方法,以免不必要的性能消耗
/// 什么时候会进行过期缓存清理?特别注意:缓存清理并不会主动进行,即使设置了过期策略也必须在以下几种情况下才清理过期项
/// 添加新的
/// 获取缓存项
/// 删除缓存项目
/// </summary>
public static void ActicateCach()
{
Task.Run(() =>
{
while (true)
{
Thread.Sleep(2000);
MemoryCache.Get("AAA");
}
});
}
}
}