Files
harmonia/Harmonia.Core/Caching/MemoryCache.cs

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 virtual long? SizeLimit => 2000000000;
protected virtual double CompactionPercentage => 0.2;
protected virtual TimeSpan SlidingExpiration => TimeSpan.FromSeconds(600);
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);
}