ASP.NET дизайн кэширования данных - PullRequest
2 голосов
/ 07 февраля 2011

У меня есть метод в моей BLL, который взаимодействует с базой данных и извлекает данные на основе определенных критериев.
Возвращенные данные представляют собой набор объектов FAQ, который определяется следующим образом:
FAQID, FAQContent, AnswerContent
Я хотел бы кэшировать возвращаемые данные, чтобы минимизировать взаимодействие с БД.
Теперь, основываясь на выбранной пользователем опции, я должен вернуть любой из следующих параметров:

  • ShowAll: все данные.
  • ShowAnsptedOnly: faqList.Where (Answercontent! = Null)
  • ShowUnansededOnly: faqList.Where (AnswerContent! = null)

Мой вопрос:
Должен ли я только кэшировать все данные, возвращаемые из БД (например, FAQ_ALL), и фильтровать другие режимы faqListиз кэша (= взаимодействует с БД только один раз и фильтрует данные из элемента кэша для двух других режимов)?Или я должен иметь 3 элемента кэша: FAQ_ALL, FAQ_ANSWERED и FAQ_UNANSWERED (= взаимодействие с базой данных для каждого режима [3 раза]) и вернуть элемент кэша для каждого режима?

Я быбудьте рады, если кто-нибудь расскажет мне о плюсах / минусах каждого подхода.

Ответы [ 2 ]

2 голосов
/ 07 февраля 2011

Пища для размышлений.

  • Сколько записей вы кэшируете, насколько большие таблицы?
  • Сколько ресурсов среднего уровня можно зарезервировать для кэширования?
  • Сколько существует данных каждого типа?
    • Как быстро будет выполняться фильтрация на стороне клиента?
  • Как часто данные меняются?
    • как часто он изменяется одним и тем же экземпляром приложения?
    • как часто оно изменяется другими приложениями или серверными заданиями?
  • Какова ваша политика аннулирования кэша?
  • Что произойдет, если вы вернете устаревшие данные?
  • Можете ли вы / должны использовать аннулирование активного кэша, например SqlDependency или LinqToCache ?

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

1 голос
/ 07 февраля 2011

Это в основном зависит от того, насколько изменчивы данные, сколько их существует и как часто к ним обращаются.

Например, если отвеченные данные не сильно изменились, вы могли бы безопасно кешировать их некоторое время; но если оставшиеся без ответа данные сильно изменились (и чаще), то ваши потребности в кэшировании могут быть другими. Если это так, то маловероятно, что кэширование его как одного набора данных будет лучшим вариантом.

Хотя это не так уж и плохо - если расхождение не слишком велико, то, возможно, все будет в порядке.

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

В качестве альтернативы можно работать с данными в памяти и рассматривать базу данных как дополнение ...

Что я имею в виду? Ну, обычно пользователь нажимает «сохранить», это вызывает код, который сохраняется в БД; когда придет следующий пользователь, он вызовет вызов, который получит данные из БД. С точки зрения дизайна, БД является гражданином первого класса, все должны пройти через это, прежде чем кто-то еще заглянет. Альтернативой является создание проекта на основе данных, которые хранятся в памяти (BLL), а затем сохраняются возможно асинхронно) в БД. Это устраняет БД как узкое место, но дает вам новый набор проблем - например, что произойдет, если соединение с базой данных оборвется или сервер умрет с данными только в памяти?

Плюсы и минусы

  • Получение всех данных за один вызов может быть быстрее (при меньшем количестве вызовов).
  • Имеет смысл получать все данные одновременно, если они связаны.
  • Гранулярность: данные, которые связаны и имеют аналогичную "кэшируемость", могут кэшироваться вместе, в противном случае вы можете захотеть хранить их в отдельных разделах кэша.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...