MemoryCache - предотвращение истечения срока действия предметов

В моем приложении я использую MemoryCache, но не ожидаю истечения срока действия элементов. Поэтому элементы вставляются в кэш с политикой по умолчанию, без AbsoulteExpiration или же SlidingExpiration быть установленным

Недавно на последнем старшем сервере у меня возникли проблемы с кешем, поскольку он возвращал нулевые значения вместо желаемых значений, вставленных в кеш ранее. Оказалось, что из кэша удаляются не только элементы, имеющие право на истечение срока действия (например, те, у которых явно указана дата окончания срока действия). Под давлением памяти, где значения CacheMemoryLimit и / или PhysicalMemoryLimit превышены, MemoryCache удаляет и другие элементы.

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

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

1 ответ

Решение

CacheItemPolicy имеет Priority свойство, которое может быть установлено в NotRemovable,

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

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

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

Другие вопросы по тегам