Я использую MemoryCache в проекте C# ядра dotnet. Я использую его для хранения списка перечислений, которые я прочитал из коллекции (я хочу сохранить его, поскольку он использует отражение для загрузки перечислений, что требует времени).
Однако, поскольку моя коллекция не изменится, я не хочу, чтобы она вообще истекала. Как я могу это сделать? Если я не установлю срок действия (SlidingExpiration или Absolute Expiration), не истечет ли срок действия моего кеша?
Если вы не укажете абсолютный и / или скользящий срок действия, то теоретически элемент будет оставаться в кэше на неопределенный срок. На практике настойчивость зависит от двух факторов:
Давление памяти. Если система ограничена ресурсами, а работающему приложению требуется дополнительная память, кэшированные элементы могут быть удалены из памяти для освобождения оперативной памяти. Однако вы можете отключить это, установив приоритет кеша для записи на CacheItemPriority.NeverRemove
.
Кэш памяти привязан к процессу. Это означает, что если вы перезапустите сервер или ваше приложение перезапустится по какой-либо причине, все, что хранится в кеше памяти, исчезнет. Кроме того, это означает, что в сценариях веб-фермы каждый экземпляр вашего приложения будет иметь собственный кеш памяти, поскольку каждый является отдельным процессом (даже если вы просто запускаете несколько экземпляров на одном сервере).
Если вы заботитесь о том, чтобы действительно выполнить операцию только один раз и сохранить результат после завершения работы приложения и даже в нескольких экземплярах вашего приложения, вам необходимо использовать распределенное кэширование с резервным хранилищем, таким как SQL Server или Redis.
Зависит от того, о каких границах вы говорите. Если не будет конкуренции за память, она теоретически расширится до 100% использования памяти. На практике этот предел будет ниже, но я не уверен, откуда вы взяли, что его не выселят, если в этом действительно есть необходимость.
Поскольку .NET Core MemoryCache на самом деле не поддерживает автоматическое вытеснение при нехватке памяти. Новая рекомендация состоит в том, чтобы определить свои собственные параметры уплотнения и при необходимости инициировать его вручную. Если вы этого не сделаете, вы просто продолжите использовать больше памяти и начнете выгружать данные, заставляя все сканировать.
Также см. Здесь, CompactOnMemoryPressure
теперь устарел: docs.microsoft.com/en-us/dotnet/api/…
Понятно. Раньше это происходило автоматически, но теперь этого не происходит. Действительно отстой, когда они делают такие вещи. Я действительно не использую кеш памяти (всегда использую Redis), поэтому не осознавал, что это изменилось. Спасибо за обновления.
Думаю, так к лучшему. Предыдущая реализация имела массу проблем и полагалась на ненадежный взлом среды CLR для определения размера объектов. Приложения, предназначенные для использования всей доступной памяти, должны адаптировать свое поведение обрезки кеша к чему-то, что имеет смысл для этого приложения. В представленном ранее обобщенном решении было слишком много проблем в слишком многих ситуациях.
Да, это неверный ответ. Изменения Asp.Net Core в MemoryCache настолько плохи, что я бы сказал, что это не тайник. Он не реагирует на давление памяти, поэтому это просто словарь. Его следует переименовать. Обновите этот ответ, чтобы отразить тот факт, что нет вытеснения из-за нехватки памяти, и я отменю голосование против.
Кажется, что кеш .NET Core не вытесняется из-за нехватки памяти и неограниченно растет, если явно не установлен предел размера.