MemoryCache - предотвращение истечения срока действия предметов
В моем приложении я использую MemoryCache, но не ожидаю истечения срока действия элементов. Поэтому элементы вставляются в кэш с политикой по умолчанию, без AbsoulteExpiration
или же SlidingExpiration
быть установленным
Недавно на последнем старшем сервере у меня возникли проблемы с кешем, поскольку он возвращал нулевые значения вместо желаемых значений, вставленных в кеш ранее. Оказалось, что из кэша удаляются не только элементы, имеющие право на истечение срока действия (например, те, у которых явно указана дата окончания срока действия). Под давлением памяти, где значения CacheMemoryLimit
и / или PhysicalMemoryLimit
превышены, MemoryCache удаляет и другие элементы.
Как это предотвратить? Как быть уверенным, что когда элемент установлен в кэш один раз, его можно безопасно извлечь из него снова?
Я подумал об установке PollingInterval
до некоторого огромного значения, но это только задерживает потенциальную проблему (и интервал опроса упоминается в документации как максимальное время, а не точное или минимальное время). настройка PhysicalMemoryLimitPercentage
до 100% также не решает проблему, поскольку она ссылается на физически установленную память, а не на всю доступную виртуальную память. Или я не прав и это действительно поможет?
1 ответ
CacheItemPolicy
имеет Priority
свойство, которое может быть установлено в NotRemovable
,
Однако вам нужно знать, сколько данных вы добавляете в кеш с помощью этого параметра. Постоянное добавление данных в кэш и их удаление никогда не вызовет проблем с памятью или переполнением.
Кэш обычно используется там, где допустимо, чтобы элемент больше не существовал в кеше, и в этом случае значение снова извлекается из постоянного хранилища (например, из базы данных или файла).
В вашем случае это звучит так, как будто ваш код требует, чтобы элемент существовал, что может предложить поиск другого подхода (например, статический ConcurrentDictionary, как упомянуто в комментариях).