Я пытаюсь реализовать кеширование в своем приложении и хочу использовать кеш памяти по умолчанию в C # (это требование можно изменить, если оно не будет работать). Моя проблема в том, что я не хочу превышать максимальный объем физической памяти, который у меня есть на машине, но, насколько я понимаю, я не могу добавить такое ограничение в кэш-память по умолчанию.
Как правило, политика:
- Если объект находился в кеше в течение 10 минут без запросов, он удаляется
- Если новый объект добавляется в кеш и максимальный объем доступной физической памяти близок к используемому, элементы удаляются на основе LRU
Мой кэш может содержать много разных объектов, и они варьируются от 10 Мб до 2-3 Гб, поэтому я не могу заставить работать функцию trim
.
Есть ли какие-либо предложения по реализации кэша LRU, отслеживающего использование оперативной памяти? И, надеюсь, это можно сделать с помощью кешей в .net?
Редактировать
Я добавил простой пример, когда MemoryCache ограничен 100 МБ и 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());
}
}