Должен ли я использовать кеш данных или выходной кэш для сложного меню навигации?

Я пытаюсь кэшировать разделы меню навигации в соответствии с разными критериями.

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

Я рассматриваю 2 варианта - кто-нибудь будет достаточно любезен, чтобы рассказать мне о плюсах и минусах каждого? И если возможно, предложите лучший подход!

Вариант 1.

Просто кэшируйте все необходимые html как строки в кэше данных. При необходимости проверьте различия пользователей вручную.

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

Вариант 2.

У вас есть NavigationController с различными дочерними действиями для каждого раздела меню. (Мы можем применить другой файл outputCacheProfile для каждого дочернего действия по мере необходимости.)

Но это потребует от нас вызова отдельного RenderAction для каждого раздела меню навигации. И я беспокоюсь об этом из-за комментария на одном из сообщений блога Фила Хаака:

[Render Action] очень похоже на другой запрос, так как мы необходимо выполнить маршрутизацию, чтобы убедиться, что у нас есть соответствующий маршрут данных и контекста для вызова метода действия. Поэтому каждый призыв к RenderAction собирается сложить.

Полное сообщение здесь: http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx

Ответ 1

Я думаю, что было общее избегание этого вопроса, потому что здесь нет правильного ответа.

Фактически, ваш выбор Архитектура для реализации сложной навигации определит лучшую стратегию Кэширование.


Я глубоко увлекаюсь навигацией через частичные представления с дочерними действиями.

Я согласен с вами в том, что ссылки на файлы больше работают. Я предпочитаю иметь записи базы данных с параметрами навигации, сгруппированными по ключам и ссылающимися на аргументы на дочерние действия.

Итак, ваша таблица навигации может выглядеть так:

grpId    Title        Path
1        Home Page    /
1        About Page   /Home/About
1        Reports Page /Reports
2        Home Page    /
2        Admin Page   /Admin
2        Reports Page /Reports

и ваше дочернее действие примет grpId

[OutputCache(Duration = 60000, VaryByParam = "grpId")]
public PartialViewResult NavigationPage(int grpId)

может вытащить все параметры вашей навигационной группы и отобразить пользовательское меню навигации. Эта форма кэша вывода настраивается по времени (60000 секунд и ваш параметр)


Вывод:

Я подозреваю, что не сказал вам ничего нового, но только подтвердил, к чему вы уже склонялись. Структура MVC очень надежна и предоставляет инструменты для удобного управления тем, что вы хотите сделать. Использование файлов и кэширования данных также является допустимым методом, но это будет больша головка и работа с вашей стороны для реализации.

Имейте в виду: Haacks post старше 4 лет ( MVC 2 Beta​​strong > ). С тех пор структура и выходной кеш прекрасно развивались. Теперь вы можете использовать Cache Partials, не беспокоясь о кешировании всей страницы. Эта недавняя ссылка на кеширование с MVC 4 не говорит напрямую о проблемах Фила ранее, но особенно пренебрегает ими.