Кэширование профилей из SqlProfileProvider - результат ProfileManager.GetAllProfiles
Я использую SqlProfileProvider на одном из моих веб-сайтов, и на одной странице мне нужно получить весь список профилей (это интранет).
Метод, который я использую, это ProfileManager.GetAllProfiles(). Проблема в том, что его производительность действительно плохая, и это значительно замедляет работу сайта.
Поэтому я думал о том, чтобы кэшировать результат вызова метода в области приложения как DataTable (так что я мог также фильтровать / искать по нему).
Моя проблема в том, что у меня есть несколько серверов, на которых запущено это веб-приложение, и я хотел бы, чтобы кэш синхронизировался. Я начал использовать memcached, но у меня возникли некоторые проблемы (поэтому я вернулся к мысли о кешировании в области приложения).
Итак, вот мои вопросы:
- Будет ли эффективно хранить DataTable, содержащий профили, в объекте Application? Или можно хранить объекты в кэше и иметь их в наличии для всех клиентов / браузеров?
- Можно ли добавить кэш-зависимость (SQL) в этот кеш?
1 ответ
Вы можете кэшировать части веб-страницы, которые будут зависеть от списка профилей, поместив их в пользовательский элемент управления и пометив его как кешируемый. Также можно определить срок действия политики кэширования SqlCacheDependency. Что касается расположения кэша, то каждый веб-сервер в ферме будет иметь свою собственную версию в памяти, но использование срока действия кэша гарантирует, что эта версия не будет синхронизирована с данными в БД.
Кэширование страниц или фрагментов является наиболее эффективным методом кэширования, поскольку в отличие от кэширования вашей модели (DataTable или чего-либо другого) вы не платите цену HTML-рендеринга.