MemoryCache в System.Runtime.Caching: срок действия элементов не истек
В настоящее время я пытаюсь вставить элементы в экземпляр MemoryCache.Default, который работает. Но предметы не истекают! Интервал опроса установлен по умолчанию: 2 минуты, никаких специальных настроек для MemoryCache не было.
Процедура добавления элемента выглядит следующим образом:
string key = "someKey";
var faultyItem = GetFaultyItemToBlockFromProcessingTheNextThreeMinutes();
if (!MemoryCache.Default.Contains(key))
{
MemoryCache.Default.Add(
new CacheItem(key, faultyItem),
new CacheItemPolicy()
{
AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(3)
});
}
Тем не менее, элементы никогда не истекают в кеше! Я ждал более 10 минут, и они все еще там в кеше. Основная цель состоит в том, чтобы предотвратить их заполнение базы данных запросами, пытаясь обрабатывать их каждые несколько секунд. Они проверяются каждые пару секунд, но не имеют SlidingExpiration. Они должны быть проверены снова примерно через 3 минуты, 5 минут, так как максимальная задержка все еще будет терпимой.
Я не хочу делать какие-либо настройки вне кода, в XML или тому подобное. Если это невозможно, есть ли хорошая альтернатива MemoryCache? Возможно с числовыми / объектными ключами и конфигурацией через параметры и свойства?
1 ответ
Я установил простое пробное приложение с нуля с фрагментом кода из вашего вопроса. Единственное изменение, которое я сделал, было следующее: var faultyItem = "test";
Надеть часы на утверждение MemoryCache.Default.Contains(key)
подтверждает, что через 3 минуты этот элемент был удален из кэша, так как этот оператор возвратил false
,
Одна возможность состоит в том, что где-то еще в вашем приложении вы уже поместили элемент в MemoryCache, используя тот же ключ, у которого нет срока действия, поэтому он никогда не выпадает и никогда не обновляется новым элементом, который имеет окончание срока действия Помимо поиска в приложении, одним из способов проверки этого будет использование именованного кэша вместо кэша по умолчанию для этой конкретной операции, чтобы определить потенциальное совместное использование. т.е. static MemoryCache testCache = new MemoryCache("TestCache")
,