Автоматически переполнять кэш по истечении срока - PullRequest
3 голосов
/ 14 сентября 2010

В настоящее время я кеширую результат вызова метода.

Код кэширования следует стандартному шаблону: он использует элемент в кэше, если он существует, в противном случае он вычисляет результат, кэшируя его для будущих вызовов, прежде чем вернуть его.

Я хотел бы оградить клиентский код от пропусков кэша (например, когда срок действия элемента истек).

Я подумываю о том, чтобы порождать поток для ожидания времени жизни кэшированного объекта, чтобы затем запустить предоставленную функцию для повторного заполнения кэша, когда (или непосредственно перед) истекает существующий элемент.

Может кто-нибудь поделиться каким-либо опытом, связанным с этим? Звучит ли это как разумный подход?

Я использую .NET 4.0.

Ответы [ 4 ]

4 голосов
/ 15 сентября 2010

Новое дополнение к .NET Framework 4.0 - Класс MemoryCache

Цитата из Документов:

Класс MemoryCache похож на класс ASP.NET Cache. Класс MemoryCache имеет много свойств и способы доступа к кешу это будет знакомо вам, если вы использовали класс ASP.NET Cache

Вы можете использовать метод AddOrGetExisting для получения или создания CacheItem, если он не существует.

4 голосов
/ 14 сентября 2010

Поскольку это ASP.NET, метод Cache.Insert() позволяет указать делегата обратного вызова.

Похоже ли это на разумный подход?

Да, обратный вызов (и зависимость от файла) предоставляются именно для такой ситуации.У вас все еще есть возможность сделать обмен между ресурсами, задержкой и устареванием.

2 голосов
/ 14 сентября 2010

Вот кеш, который никогда не истекает ничего:

var cache = new ConcurrentDictionary<TKey, TValue>();

var value = cache.GetOrAdd(someKey, key => MyMethod(key));

Это помогает?


Вот кеш, который никогда не истекает и обновляет значение после определенного времени жизни:

var cache = new ConcurrentDictionary<TKey, Tuple<TValue, DateTime>>();

var value = cache.AddOrUpdate(someKey,
             key => Tuple.Create(MyMethod(key), DateTime.Now),
    (key, value) => (value.Item2 + lifetime < DateTime.Now)
                  ? Tuple.Create(MyMethod(key), DateTime.Now)
                  : value)
                  .Item1;

Это помогает?

0 голосов
/ 14 сентября 2010

Кажется, что нет никакого смысла в истечении срока действия объекта, чтобы просто немедленно воссоздать его. Просто выключите истечение срока действия; дтб показывает как.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...