43 lines
1.2 KiB
C#
43 lines
1.2 KiB
C#
using Microsoft.Extensions.Caching.Memory;
|
|
|
|
namespace Harmonia.Core.Caching;
|
|
|
|
public abstract class MemoryCache<TKey, TValue> : Cache<TKey, TValue> where TKey : notnull
|
|
{
|
|
private readonly IMemoryCache _memoryCache;
|
|
|
|
protected abstract long? SizeLimit { get; }
|
|
protected abstract double CompactionPercentage { get; }
|
|
protected abstract TimeSpan SlidingExpiration { get; }
|
|
|
|
public MemoryCache()
|
|
{
|
|
MemoryCacheOptions memoryCacheOptions = new()
|
|
{
|
|
SizeLimit = SizeLimit,
|
|
CompactionPercentage = CompactionPercentage
|
|
};
|
|
|
|
_memoryCache = new MemoryCache(memoryCacheOptions);
|
|
}
|
|
|
|
protected override TValue? TryGetValue(object key)
|
|
{
|
|
_memoryCache.TryGetValue(key, out TValue? value);
|
|
|
|
return value;
|
|
}
|
|
|
|
protected override void AddToCache(object key, TValue entry)
|
|
{
|
|
long entrySize = GetEntrySize(entry);
|
|
|
|
var cacheEntryOptions = new MemoryCacheEntryOptions()
|
|
.SetSize(entrySize)
|
|
.SetSlidingExpiration(SlidingExpiration);
|
|
|
|
_memoryCache.Set(key, entry, cacheEntryOptions);
|
|
}
|
|
|
|
protected abstract long GetEntrySize(TValue entry);
|
|
} |