Ядро Dotnet в кэше памяти - срок действия по умолчанию

Я использую MemoryCache в проекте C# ядра dotnet. Я использую его для хранения списка перечислений, которые я прочитал из коллекции (я хочу сохранить его, поскольку он использует отражение для загрузки перечислений, что требует времени).

Однако, поскольку моя коллекция не изменится, я не хочу, чтобы она вообще истекала. Как я могу это сделать? Если я не установлю срок действия (SlidingExpiration или Absolute Expiration), не истечет ли срок действия моего кеша?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
0
10 544
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы не укажете абсолютный и / или скользящий срок действия, то теоретически элемент будет оставаться в кэше на неопределенный срок. На практике настойчивость зависит от двух факторов:

  1. Давление памяти. Если система ограничена ресурсами, а работающему приложению требуется дополнительная память, кэшированные элементы могут быть удалены из памяти для освобождения оперативной памяти. Однако вы можете отключить это, установив приоритет кеша для записи на CacheItemPriority.NeverRemove.

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

Если вы заботитесь о том, чтобы действительно выполнить операцию только один раз и сохранить результат после завершения работы приложения и даже в нескольких экземплярах вашего приложения, вам необходимо использовать распределенное кэширование с резервным хранилищем, таким как SQL Server или Redis.

Кажется, что кеш .NET Core не вытесняется из-за нехватки памяти и неограниченно растет, если явно не установлен предел размера.

Mike Marynowski 20.03.2019 21:51

Зависит от того, о каких границах вы говорите. Если не будет конкуренции за память, она теоретически расширится до 100% использования памяти. На практике этот предел будет ниже, но я не уверен, откуда вы взяли, что его не выселят, если в этом действительно есть необходимость.

Chris Pratt 20.03.2019 23:12

Поскольку .NET Core MemoryCache на самом деле не поддерживает автоматическое вытеснение при нехватке памяти. Новая рекомендация состоит в том, чтобы определить свои собственные параметры уплотнения и при необходимости инициировать его вручную. Если вы этого не сделаете, вы просто продолжите использовать больше памяти и начнете выгружать данные, заставляя все сканировать.

Mike Marynowski 22.03.2019 00:04

Также см. Здесь, CompactOnMemoryPressure теперь устарел: docs.microsoft.com/en-us/dotnet/api/…

Mike Marynowski 22.03.2019 00:06

Понятно. Раньше это происходило автоматически, но теперь этого не происходит. Действительно отстой, когда они делают такие вещи. Я действительно не использую кеш памяти (всегда использую Redis), поэтому не осознавал, что это изменилось. Спасибо за обновления.

Chris Pratt 22.03.2019 11:29

Думаю, так к лучшему. Предыдущая реализация имела массу проблем и полагалась на ненадежный взлом среды CLR для определения размера объектов. Приложения, предназначенные для использования всей доступной памяти, должны адаптировать свое поведение обрезки кеша к чему-то, что имеет смысл для этого приложения. В представленном ранее обобщенном решении было слишком много проблем в слишком многих ситуациях.

Mike Marynowski 29.03.2019 09:44

Да, это неверный ответ. Изменения Asp.Net Core в MemoryCache настолько плохи, что я бы сказал, что это не тайник. Он не реагирует на давление памяти, поэтому это просто словарь. Его следует переименовать. Обновите этот ответ, чтобы отразить тот факт, что нет вытеснения из-за нехватки памяти, и я отменю голосование против.

Chris Moschini 03.02.2021 15:09

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