Согласно MSDN, кэш будет очищен в следующих случаях:
- Код очищает запись вручную.
- При использовании метода
Remove
объекта Cache
.
- Срок действия записи в кэше истекает.
- При использовании параметров
absoluteExpiration
или slidingExpiration
методов Add
и Insert
объекта Cache
.
- Зависимостькэшированный элемент удаляется из кэша.
- Путем определения зависимости с помощью класса
CacheDependency
при добавлении элементов в кэш. - Удаление зависимости приведет к удалению / истечению срока действия всех зависимых элементов.
- Процесс хоста завершается (сброс приложения или IIS, перезапуск пула приложений и т. Д.).
- Недостаточно системной памяти (автоматически - называется очистка - см. Ниже).
Scavenging
Несмотря на то, что случаи с 1 по 4 в основном говорят сами за себя, сценарий доступности системной памяти на первый взгляд может быть неочевидным.См. Приведенную ниже цитату из статьи MSDN о кэшировании данных приложения.
Класс Cache предлагает мощные функции, которые позволяют настроить способ кэширования элементов и продолжительность их кэширования.Например, , когда системной памяти становится недостаточно, кеш автоматически удаляет редко используемые или низкоприоритетные элементы для освобождения памяти .Этот метод называется scavenging и является одним из способов, благодаря которым кеш гарантирует, что устаревшие данные не потребляют ценные ресурсы сервера.
В соответствии сВ той же статье вы можете установить уровни приоритета для своих кэшированных элементов, чтобы попытаться защитить ваши наиболее важные элементы от автоматического удаления с помощью перечисления CacheItemPriority
.
var expiresAt = DateTime.UtcNow.Date.AddHours(24);
System.Web.HttpContext.Current.Cache.Insert(
"myKey",
myValue,
null,
expiresAt,
Cache.NoSlidingExpiration,
CacheItemPriority.High,
null
);
Обратите внимание, что у вас также есть возможность настройкиприоритет NotRemovable
, который отключил бы автоматическое удаление этого элемента через очистку.Однако обратите внимание, что это не стандартное поведение.
Также обратите внимание, что, если вы используете большие объемы памяти через кеш, устанавливая приоритет NotRemovable
, ваше приложение может выдавать ошибки доступности памяти во время выполнения.
Информация о том, сколько памяти вашей системы доступно для кэша вашего приложения, может быть получена через свойство EffectivePercentagePhysicalMemoryLimit
объекта Cache
.
Ведение журнала / отладка
Если вы хотите тщательно понять состояние кэша в вашем приложении с помощью журналов (например), обычно полезно взглянуть на моменты, когда элемент вставляется и удаляется из кэша.
Регистрация моментагде элемент вставляется обычно довольно просто, так как вам нужно только искать вызовы Add
или Insert
методов объекта Cache
.
Однако, поскольку кэшированные элементы могут быть автоматически удалены, чтобы регистрировать удаление элемента, вы должны использовать тип делегата CacheItemRemovedCallback
при вставке элементов вкеш.
Это может быть очень полезно при отладке / улучшении устаревших приложений, которые в значительной степени зависят от данных кэширования.
Подробнее см. в статье MSDN ниже.
Источники:
Статьи MSDN:
API:
Я знаю, что этот вопрос вернулся с 2011 года. Однако мне потребовалось некоторое время, чтобы выяснить,ошибка в унаследованном приложении, над которым я работал, была вызвана политикой автоматической очистки, основанной на доступной физической памяти.
Hopefullу, этот ответ поможет кому-то еще.
И благодаря @J.Эд и @Oded за их ответ и комментарии.Они помогли мне встать на правильный путь, чтобы найти проблему.