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

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

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

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

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


person Wojtek    schedule 27.11.2017    source источник
comment
Ваш вопрос побуждает нас предложить увеличить объем оперативной памяти или периодически удалять некоторые значения из кеша. Вы не можете заполнить кеш навсегда.   -  person lucky    schedule 27.11.2017
comment
Возможно, вместо этого вы захотите использовать статический ConcurrentDictionary?   -  person Magnus    schedule 27.11.2017
comment
CacheItemPolicy имеет Свойство Priority, для которого можно установить значение NotRemovable.   -  person Eric B    schedule 27.11.2017
comment
Спасибо @EricB, я как-то пропустил эту настройку, и это именно то, что мне нужно.   -  person Wojtek    schedule 28.11.2017
comment
Я добавил расширенную версию своего комментария в качестве ответа, так как он решил вашу проблему, и чтобы помочь другим найти ее в будущем.   -  person Eric B    schedule 01.12.2017


Ответы (1)


CacheItemPolicy имеет Priority , для которого можно установить значение NotRemovable.

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

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

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

person Eric B    schedule 01.12.2017