97 lines
3.5 KiB
C#
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");
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|