Как мне кэшировать сложный объект, создаваемый в ASP.NET MVC?

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

При создании расписания пользователь может добавлять, редактировать или удалять столько задач, сколько он хочет, прежде чем, наконец, сохранить расписание. Эти изменения сохраняются в базе данных, чтобы пользователь мог продолжить редактирование позже (если его сеанс неожиданно завершится или он будет прерван).

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

Это кажется излишним, когда редактируется только задача. Я хочу кэшировать объект расписания и его список задач в HttpContext.Session и обновлять только изменяемую отдельную задачу (или объект расписания при его изменении).

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


person chani    schedule 18.02.2013    source источник


Ответы (2)


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

person Shane Andrade    schedule 18.02.2013
comment
Вы бы предпочли просто запрашивать базу данных для полного объекта расписания после каждого редактирования одной задачи? Для меня это звучит непозволительно дорого. - person chani; 19.02.2013
comment
Кажется, что более простой подход наиболее вероятен. Я не уверен, каковы ваши пороги для медленной загрузки страницы и прочего, но если это недостаточно быстро для вас, вам может понадобиться использовать что-то помимо базы данных. Возможно, стоит рассмотреть распределенную систему кэширования, такую ​​как memcached, которая решит проблемы, о которых я писал выше. - person Shane Andrade; 19.02.2013
comment
Вы правы — я понял, что мне нужно отдельно обновить как сохраненную копию (путем вызова метода DAL), так и мою локальную копию (путем обновления кэшированного объекта). Забудьте о преждевременно завершившихся сессиях, ошибка программиста, вероятно, поставит меня в тупик. У меня нет большого опыта работы с базой данных, поэтому я думаю, что слишком параноидально оцениваю стоимость каждой операции. - person chani; 19.02.2013

Есть ли опасность рассинхронизации двух моих версий?

Пока вы получаете новое состояние с сервера после успешного редактирования и обновления кеша, проблем не должно быть.

Следует иметь в виду одну вещь: если вы собираетесь разрешить совместное редактирование, вам придется ввести опрос, чтобы гарантировать, что ваша локальная копия не устареет. Однако судя по вашему описанию, это маловероятно.

person James    schedule 18.02.2013