我正在尝试在我的应用程序中实现一些缓存,并且我想使用 C# 中的默认内存缓存(如果它不起作用,可以更改此要求)。我的问题是不想超过我在机器上拥有的最大物理内存量,但据我所知,我无法将这样的约束添加到默认内存缓存中。
一般来说,政策是:
- 如果对象已在缓存中 10 分钟且没有请求,则将其删除
- 如果一个新对象被添加到缓存中并且可用物理内存的最大数量接近使用,则基于 LRU 删除元素
我的缓存可以包含许多不同的对象,它们的范围从 10mb 到 2-3gb,所以我无法真正让该trim
功能正常工作。
关于如何实现监控内存使用情况的 LRU 缓存有什么建议吗?并且希望它可以使用.net中的缓存来完成?
编辑
我添加了一个简单的示例,其中 MemoryCache 被限制为 100Mb 和 20% 的物理内存,但这并没有改变任何东西。我的记忆充满了没有删除缓存条目。请注意,轮询间隔更改为每 5 秒。
class Item
{
private List<Guid> data;
public Item(int capacity)
{
this.data = new List<Guid>(capacity);
for (var i = 0; i < capacity; i++)
data.Add(Guid.NewGuid());
}
}
class Program
{
static void Main(string[] args)
{
var cache = new MemoryCache(
"MyCache",
new NameValueCollection
{
{ "CacheMemoryLimitMegabytes", "100" },
{ "PhysicalMemoryLimitPercentage", "20" },
{ "PollingInterval", "00:00:05" }
});
for (var i = 0; i < 10000; i++)
{
var key = String.Format("key{0}", i);
Console.WriteLine("Add item: {0}", key);
cache.Set(key, new Item(1000000), new CacheItemPolicy() { UpdateCallback = UpdateHandler } );
}
Console.WriteLine("\nDone");
Console.ReadKey();
}
public static void UpdateHandler(CacheEntryUpdateArguments args)
{
Console.WriteLine("Remove: {0}, Reason: {1}", args.Key, args.RemovedReason.ToString());
}
}