Я настраиваю свой MemoryCache следующим образом:
DataCache = new MemoryCache(new MemoryCacheOptions
{
ExpirationScanFrequency = TimeSpan.FromMinutes(5)
});
CacheOptions = new MemoryCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5)
};
А затем использовать его следующим образом:
DataCache.Set(Keys.Users, listAllUsers, CacheOptions);
Это верно? Мне кажется странным, что мне приходится устанавливать его в двух местах.
Первый из них — это не истечение срока действия кэша. Тайм-аут устанавливается на основе ключа. Первый предназначен для настройки задания, проверяющего кэш на наличие ключей с истекшим сроком действия. Не следует придавать ему такое большое значение. Я не так уверен, но срок действия ключа истекает также при доступе к нему после того, как значение тайм-аута приостановлено.
@Fildor Если я правильно вас понимаю (и перечитываю документацию, которая, на мой взгляд, неясна), MemoryCache.ExpirationScanFrequency — это то, как часто он сканирует кеш на предмет просроченных элементов. И это, вероятно, должно быть от 10 до 60 секунд??? И CacheOptions.AbsoluteExpirationRelativeToNow сколько времени пройдет до того, как значение кэша, которое я только что установил, истечет и будет удалено??? Так что это достаточно 5 минут (для моего варианта использования).
Срок действия и удаление не происходят одновременно. Строка кэша с истекшим сроком действия, так сказать, «невидима» и будет удалена при следующем сканировании.
@Fildor Я предполагаю, что есть задержка. Но если я установлю срок действия 5 минут и сканирование 15 секунд, то в худшем случае через 5:15 он исчезнет. Это нормально. По определению истечение срока действия элементов в кэше из-за тайм-аута является диапазоном. Все это основано на оценках того, каковы компромиссы между 100% актуальностью и отсутствием обращений к базе данных 100 раз в секунду.
Ах, да, ты прав. Только что проверил, и невидимость — это функция, которую мы добавили к ней, потому что нам нужно, чтобы срок действия строки кэша истекал «резко». Итак, да: комбинация цикла из 5 минут и 15 секунд даст вам окно от 5:00 до 5:15 для исчезновения строки кэша.
@Fildor Если вы напишете все свои комментарии в качестве ответа, буду рад принять их.





Срок действия (по времени) строки кэша состоит из двух частей:
Промежуток времени, по истечении которого срок действия строки кэша истекает. В данном случае это означает, что он имеет право на удаление (так называемое «выселение»). Это пассивная вещь - нет фрагмента кода, который активно устанавливает строку кэша с действительной на просроченную, это просто временная метка, которая становится «старее», чем «сейчас».
Время цикла, в течение которого выполняется активный процесс, который сканирует кэш на наличие строк с истекшим сроком действия и удаляет их.
Сочетание обоих результатов приводит к фактическому сроку действия и удалению отдельной строки кэша. Если мы возьмем пример истечения срока действия через 5 минут с момента вставки и цикл сканирования каждые 15 секунд, то в лучшем (или коротком) случае цикл выполняется точно так, что истечение срока происходит в одно и то же время, а строка удаляется сразу после 5 минут. В худшем (или самом длинном) случае цикл сканирования завершается непосредственно перед истечением срока действия, а строка кэша живет 5 минут и 15 секунд (все +/- неточности системного времени/часов).
Если вы установите для обоих значение 5 минут, вы получите отдельные строки кэша, живущие в любое время от 5 до 10 минут. (С точки зрения статистики, если предположить, что вставки нормально распределены.)
Для будущих читателей этого ответа: обратите внимание на важное замечание в документации
В .NET есть два класса MemoryCache: один в пространстве имен System.Runtime.Caching, а другой в пространстве имен Microsoft.Extensions.Caching.
(выделено мной)
Также имейте в виду, что существует также SlidingExpiration, который не рассматривается ни в вопросе, ни в этом ответе. SlidingExpiration продлит порог истечения срока действия при попадании в строку кэша. Рекомендуется при его использовании установить как скользящее, так и абсолютное значение, чтобы избежать того, что часто встречающаяся строка кэша никогда не будет вытеснена (что может вызвать проблемы).
И мы должны использовать Microsoft.Extensions.Caching — верно?
@DavidThielen Если я правильно помню, ссылка в ответе должна содержать раздел, в котором говорится о том, какой из них использовать, где и почему. ОБНОВЛЕНИЕ: Нет, это было здесь: Learn.microsoft.com/en-us/aspnet/core/ Performance/caching/…
Не забывайте, что вы также можете установить срок действия для каждого элемента при добавлении записи в кеш.