Кэшировать весь ответ в распределенный кеш (Redis)

Я хотел бы кэшировать всю страницу в распределенный кеш (в частности, Redis) в веб-приложении ASP.NET Core 2.1 MVC. Когда пользователь посещает страницу, выполняется код метода действия и представления cshtml, и страница создается и отправляется пользователю. Я хотел бы, чтобы эта страница кэшировалась в конце запроса, чтобы при посещении страницы последующими пользователями она представлялась из кеша без необходимости выполнять какой-либо код в методе действия или представлении. А точнее, я бы хотел, чтобы это было кешировано в Redis. Я знаком с тем, как хранить пары ключ-значение в Redis из веб-приложения, а также знаком с тем, как кэшировать части страницы в Redis, но я не могу понять, как кэшировать страницу весь в Redis.

Я успешно использовал специфичную для Redis реализацию интерфейса IDistributedCache для хранения пар ключ-значение в Redis. Это было достигнуто путем установки пакета NuGet Microsoft.Extensions.Caching.Redis.Core и добавления следующего оператора в ConfigureServices():

services.AddDistributedRedisCache(options =>
{
    options.Configuration = "localhost";
    options.InstanceName = "SampleInstance";
});

Как только это было сделано, я смог внедрить реализацию Redis IDistributedCache в контроллер, а затем использовать такие операторы, как _cache.GetStringAsync() и _cache.SetStringAsync(), для хранения и извлечения пар ключ-значение в Redis. Я также могу использовать помощник тега <distributed-cache> на странице .cshtml для кеширования частей представления.

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

Я также знаю, как можно выполнить базовое кэширование страниц в ASP Core 2.1 с использованием встроенных функций. Все, что нужно сделать, это добавить атрибут [ResponseCaching(Duration=...)] к методу действия, добавить операторы services.AddResponseCaching() и app.UseResponseCaching() к ConfigureServices() и Configure() соответственно в Startup.cs. К сожалению, страница кэшируется на экземпляре сервера, предположительно в памяти сервера. Я не могу понять, как указать ему кэшировать эту страницу в Redis.

В основном я хочу что-то вроде [ResponseCaching(Duration=..., CACHE=REDIS)]. Как этого добиться?


Старый эквивалент ASP.NET 4

В ASP.NET 4 можно просто добавить к действию атрибут [OutputCache(Duration=...)], установить пакет NuGet Microsoft.Web.RedisOutputCacheProvider и поместить следующее в web.config

<caching>
    <outputCache defaultProvider = "MyRedisOutputCache">
       <providers>
          <add name = "MyRedisOutputCache" type=... host = "" ssl = "true" />
       </providers>
    </outputCache>
</caching>

И впоследствии вся страница будет кэширована в Redis. Это было действительно просто. Это именно та функциональность, которую я пытаюсь воспроизвести в ASP Core 2.1.

Это реализация по умолчанию github.com/aspnet/ResponseCaching/blob/dev/src/…. Здесь важно то, что он реализует IResponseCache, поэтому используйте его в качестве руководства для реализации кеша ответов с использованием IDistributedCache.

Brad 14.06.2018 02:34
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
382
1

Ответы 1

вы можете использовать фильтры действий ASP.NET MVC.

перезаписать OnResultExecuted, чтобы сохранить окончательный результат в кеше Redis.

проверьте, существует ли кеш в OnActionExecuting.

вызов OnResultExecuted после того, как представление html будет готово, чтобы вы могли сохранить визуализированный html.

вызов OnActionExecuting перед действием, чтобы вы могли загружать данные из кеша. проверьте фильтры действий ASP.NET MVC в этом ссылка на сайт.

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