feat: 更新缓存工程逻辑
This commit is contained in:
parent
01c2857be6
commit
4695b8e17e
|
@ -1,5 +1,6 @@
|
|||
using BootstrapAdmin.Caching.Services;
|
||||
using Microsoft.Extensions.Caching.Memory;
|
||||
using Microsoft.Extensions.Primitives;
|
||||
|
||||
namespace BootstrapAdmin.Caching;
|
||||
|
||||
|
@ -16,10 +17,11 @@ public static class CacheManager
|
|||
/// <typeparam name="TItem"></typeparam>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="valueFactory"></param>
|
||||
/// <param name="token"></param>
|
||||
/// <returns></returns>
|
||||
public static TItem GetOrAdd<TItem>(string key, Func<ICacheEntry, TItem> valueFactory)
|
||||
public static TItem GetOrAdd<TItem>(string key, Func<ICacheEntry, TItem> valueFactory, IChangeToken? token = null)
|
||||
{
|
||||
return Cache.GetOrAdd(key, valueFactory);
|
||||
return Cache.GetOrAdd(key, valueFactory, token);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
// Website: https://www.blazor.zone or https://argozhang.github.io/
|
||||
|
||||
using Microsoft.Extensions.Caching.Memory;
|
||||
using Microsoft.Extensions.Primitives;
|
||||
|
||||
namespace BootstrapAdmin.Caching;
|
||||
|
||||
|
@ -17,8 +18,9 @@ public interface ICacheManager
|
|||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="factory"></param>
|
||||
/// <param name="token"></param>
|
||||
/// <returns></returns>
|
||||
T GetOrAdd<T>(string key, Func<ICacheEntry, T> factory);
|
||||
T GetOrAdd<T>(string key, Func<ICacheEntry, T> factory, IChangeToken? token = null);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
|
|
|
@ -8,8 +8,6 @@ class DefaultCacheManager : ICacheManager
|
|||
[NotNull]
|
||||
private MemoryCache? Cache { get; set; }
|
||||
|
||||
private List<(string Key, CancellationTokenSource Token)> Keys { get; } = new(256);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
|
@ -20,13 +18,20 @@ class DefaultCacheManager : ICacheManager
|
|||
|
||||
private void Init()
|
||||
{
|
||||
Keys.Clear();
|
||||
Cache = new MemoryCache(new MemoryCacheOptions());
|
||||
}
|
||||
|
||||
public T GetOrAdd<T>(string key, Func<ICacheEntry, T> factory) => Cache.GetOrCreate(key, entry =>
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="factory"></param>
|
||||
/// <param name="token"></param>
|
||||
/// <returns></returns>
|
||||
public T GetOrAdd<T>(string key, Func<ICacheEntry, T> factory, IChangeToken? token = null) => Cache.GetOrCreate(key, entry =>
|
||||
{
|
||||
HandlerEntry(key, entry);
|
||||
HandlerEntry(key, entry, token);
|
||||
return factory(entry);
|
||||
});
|
||||
|
||||
|
@ -43,50 +48,25 @@ class DefaultCacheManager : ICacheManager
|
|||
return factory(entry);
|
||||
});
|
||||
|
||||
private void HandlerEntry(string key, ICacheEntry entry)
|
||||
private static void HandlerEntry(string key, ICacheEntry entry, IChangeToken? token = null)
|
||||
{
|
||||
(string Key, CancellationTokenSource Token) cacheKey = new();
|
||||
cacheKey.Key = key;
|
||||
|
||||
if (entry.AbsoluteExpiration == null || entry.SlidingExpiration == null || entry.AbsoluteExpirationRelativeToNow == null)
|
||||
if (token != null)
|
||||
{
|
||||
// 缓存 10 分钟
|
||||
entry.SlidingExpiration = TimeSpan.FromMinutes(10);
|
||||
}
|
||||
|
||||
if (entry.ExpirationTokens.Count == 0)
|
||||
{
|
||||
// 增加缓存 Token
|
||||
cacheKey.Token = new CancellationTokenSource();
|
||||
entry.AddExpirationToken(new CancellationChangeToken(cacheKey.Token.Token));
|
||||
entry.AddExpirationToken(token);
|
||||
}
|
||||
|
||||
entry.RegisterPostEvictionCallback((key, value, reason, state) =>
|
||||
{
|
||||
// 清理过期缓存键值
|
||||
var k = key.ToString();
|
||||
if (!string.IsNullOrEmpty(k))
|
||||
{
|
||||
var item = Keys.LastOrDefault(item => item.Key == k);
|
||||
if (item.Key != null)
|
||||
{
|
||||
Keys.Remove(item);
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
Keys.Add(cacheKey);
|
||||
}
|
||||
|
||||
public void Clear(string? key)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(key))
|
||||
{
|
||||
var (Key, Token) = Keys.LastOrDefault(item => item.Key == key);
|
||||
if (Token != null)
|
||||
{
|
||||
Token.Cancel();
|
||||
Token.Dispose();
|
||||
}
|
||||
// 通过 TokenManager 管理依赖
|
||||
Cache.Remove(key);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue