Где/как установить тайм-аут для MemoryCache?

Я настраиваю свой MemoryCache следующим образом:

DataCache = new MemoryCache(new MemoryCacheOptions
{
    ExpirationScanFrequency = TimeSpan.FromMinutes(5)
});
CacheOptions = new MemoryCacheEntryOptions
{
    AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5)
};

А затем использовать его следующим образом:

DataCache.Set(Keys.Users, listAllUsers, CacheOptions);

Это верно? Мне кажется странным, что мне приходится устанавливать его в двух местах.

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

gunr2171 24.09.2023 06:24

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

Eldar 24.09.2023 06:25
В документации довольно четко указано, что такое частота сканирования: «Получает или устанавливает минимальный промежуток времени между последовательными проверками на наличие элементов с истекшим сроком годности». Я бы посоветовал попробовать собственную реализацию такого кеша, тогда все станет ясно. Вам нужен пассивный срок действия, при котором строка кэша не будет считаться попаданием. И тогда вам понадобится активный метод для очистки кэша просроченных строк. Для последнего и предназначена частота сканирования.
Fildor 24.09.2023 09:49

@Fildor Если я правильно вас понимаю (и перечитываю документацию, которая, на мой взгляд, неясна), MemoryCache.ExpirationScanFrequency — это то, как часто он сканирует кеш на предмет просроченных элементов. И это, вероятно, должно быть от 10 до 60 секунд??? И CacheOptions.AbsoluteExpirationRelativeToNow сколько времени пройдет до того, как значение кэша, которое я только что установил, истечет и будет удалено??? Так что это достаточно 5 минут (для моего варианта использования).

David Thielen 24.09.2023 18:51

Срок действия и удаление не происходят одновременно. Строка кэша с истекшим сроком действия, так сказать, «невидима» и будет удалена при следующем сканировании.

Fildor 24.09.2023 19:47

@Fildor Я предполагаю, что есть задержка. Но если я установлю срок действия 5 минут и сканирование 15 секунд, то в худшем случае через 5:15 он исчезнет. Это нормально. По определению истечение срока действия элементов в кэше из-за тайм-аута является диапазоном. Все это основано на оценках того, каковы компромиссы между 100% актуальностью и отсутствием обращений к базе данных 100 раз в секунду.

David Thielen 24.09.2023 22:36

Ах, да, ты прав. Только что проверил, и невидимость — это функция, которую мы добавили к ней, потому что нам нужно, чтобы срок действия строки кэша истекал «резко». Итак, да: комбинация цикла из 5 минут и 15 секунд даст вам окно от 5:00 до 5:15 для исчезновения строки кэша.

Fildor 25.09.2023 08:21

@Fildor Если вы напишете все свои комментарии в качестве ответа, буду рад принять их.

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

Ответы 1

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

Срок действия (по времени) строки кэша состоит из двух частей:

  1. Промежуток времени, по истечении которого срок действия строки кэша истекает. В данном случае это означает, что он имеет право на удаление (так называемое «выселение»). Это пассивная вещь - нет фрагмента кода, который активно устанавливает строку кэша с действительной на просроченную, это просто временная метка, которая становится «старее», чем «сейчас».

  2. Время цикла, в течение которого выполняется активный процесс, который сканирует кэш на наличие строк с истекшим сроком действия и удаляет их.

Сочетание обоих результатов приводит к фактическому сроку действия и удалению отдельной строки кэша. Если мы возьмем пример истечения срока действия через 5 минут с момента вставки и цикл сканирования каждые 15 секунд, то в лучшем (или коротком) случае цикл выполняется точно так, что истечение срока происходит в одно и то же время, а строка удаляется сразу после 5 минут. В худшем (или самом длинном) случае цикл сканирования завершается непосредственно перед истечением срока действия, а строка кэша живет 5 минут и 15 секунд (все +/- неточности системного времени/часов).

Если вы установите для обоих значение 5 минут, вы получите отдельные строки кэша, живущие в любое время от 5 до 10 минут. (С точки зрения статистики, если предположить, что вставки нормально распределены.)

Для будущих читателей этого ответа: обратите внимание на важное замечание в документации

В .NET есть два класса MemoryCache: один в пространстве имен System.Runtime.Caching, а другой в пространстве имен Microsoft.Extensions.Caching.

(выделено мной)

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

И мы должны использовать Microsoft.Extensions.Caching — верно?

David Thielen 25.09.2023 17:10

@DavidThielen Если я правильно помню, ссылка в ответе должна содержать раздел, в котором говорится о том, какой из них использовать, где и почему. ОБНОВЛЕНИЕ: Нет, это было здесь: Learn.microsoft.com/en-us/aspnet/core/ Performance/caching/…

Fildor 25.09.2023 17:12

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