Как реализуется кэширование в ASP.NET
Что проверяют
Знаете ли вы уровни кэша в ASP.NET Core и их различия, а не только IMemoryCache. Интервьюеру важно, как вы решаете инвалидацию и что происходит при нескольких экземплярах приложения. Следом обычно спрашивают про лавину промахов, когда сотня запросов разом идёт в базу за одним ключом.
Как отвечать
Разложите по уровням:
IMemoryCache: кэш в памяти процесса, самый быстрый. ЗадавайтеAbsoluteExpirationRelativeToNow, а скользящее время жизни только вместе с ним. Если в опциях кэша заданSizeLimit, каждая запись обязана указатьSize, иначе будет исключение;IDistributedCache: общий кэш для всех экземпляров, чаще всего Redis черезAddStackExchangeRedisCache. Значения хранятся какbyte[], сериализация на вас;HybridCache: появился вместе с .NET 9, объединяет локальный и распределённый уровни и защищает от лавины: фабрика для ключа выполняется один раз. Для нового кода это разумный выбор по умолчанию;- Output caching:
AddOutputCacheи[OutputCache]кэшируют готовые HTTP-ответы на сервере, с политиками и сбросом по тегу черезIOutputCacheStore.EvictByTagAsync. По умолчанию кэшируются толькоGETиHEADс кодом 200, запросы аутентифицированных пользователей не кэшируются; - HTTP-заголовки:
Cache-ControlиETagдля браузера и CDN. MiddlewareAddResponseCachingлишь следует этим заголовкам.
В классическом ASP.NET на .NET Framework ту же роль играли System.Runtime.Caching.MemoryCache и [OutputCache] в MVC 5, это стоит упомянуть, если проект старый.
Завершите стратегией: что кэшируется (дорогие и редко меняющиеся данные), как строится ключ, сколько живёт запись и кто сбрасывает её после изменения данных.
Где спотыкаются
Используют IMemoryCache при нескольких экземплярах за балансировщиком. Каждый держит свою версию данных, и пользователь видит разное в зависимости от того, куда попал запрос.
Ставят только скользящее время жизни. Популярный ключ, который читают постоянно, не истекает никогда и отдаёт устаревшие данные.
Считают, что GetOrCreateAsync защищает от лавины промахов. Для IMemoryCache это не так: фабрика может выполниться параллельно в нескольких запросах.