Каковы шаблоны и рекомендации по кэшированию в ASP.NET?
Мы работаем над большим устаревшим приложением, и мы перепроектируем бизнес-уровень и уровень данных. Мы считаем, что самое время перепроектировать процесс обработки кеша. Существуют ли какие-либо шаблоны и лучшие практики для реализации слоя кеширования (или создания его на бизнес-уровне)?
Единственное, что я могу придумать, - это использовать зависимость SQL Cache Dependency (что сложно из-за того, что у нас есть большая устаревшая база данных с большим количеством таблиц, которые не всегда соответствуют бизнес-объектам) и внедрение строго типизированных CacheManager, чтобы скрыть строковые ключи и устранить проблемы с классом.
Есть ли что-то более сложное, что мы можем сделать? Есть ли способ применить кэш-аннулирование при выполнении обновления/удаления? Должны ли мы каким-то образом поддерживать один объект в кеше и извлекать список идентификаторов из БД, которые всегда работают с одними и теми же объектами?
В основном, какие методы кэширования вы используете в ASP.NET? Слишком плохо, мы не можем использовать контейнеры IoC или рамки ORM, которые поддерживают кеш: (
Изменить: меня больше беспокоит ремонтопригодность, чем производительность.
Ответы
Ответ 1
- Просто сохраните каждый запрос в базе данных (с ключом кеша: ваш запрос, значение: список бизнес-объектов)
- Используйте распределенный кеш, например memcached, рядом с кешем ASP.Net
- Используйте сложный кэш-менеджер, например https://github.com/enyim/memcached-providers; которые могут иметь кэш-группы. Некоторые данные должны храниться в течение длительного времени, короткое время. Некоторые данные должны храниться в кеше ASP.Net и т.д.
- Выполнять вызовы, которые должны храниться в кеше, используя функцию-обертку, например
public T GetFromCache<T>(string key, Func<T> ifKeyNotFoundDelegate)
, чтобы гарантировать, что кеш всегда используется одинаково. [1]
- Подумайте, когда использовать кеш ASP.Net и когда использовать распределенный кеш. Данные, которые читаются каждый запрос, должны храниться в ASP.Net, такие большие данные, как результаты поиска; с множеством различных ключей и данных и т.д., должны быть в memcached.
- Добавить управление версиями. Префикс всех ключей с номером версии, поэтому при обновлении веб-приложения у вас не возникнут проблемы, а некоторые объекты будут изменены.
Хорошо, это касается большей части того, что мы делаем на нашем веб-сайте (кластер memcached объемом 20 ГБ, распространяемый на 20 серверах).
[1] Сделав такую функцию единственным интерфейсом для хранения материала в кеше, вы можете добиться следующего. Скажем, я хочу использовать что-то из кеша, как результат из функции. Обычно вы делаете что-то вроде
CacheManager cm = new CacheManager(CacheGroups.Totals);
object obj = cm.GetFromCache("function1result");
if(obj == null)
{
obj = (object)DAO.Foo();
cm.StoreInCache("function1result", obj);
}
return (List<MyEntity>)obj;
Используя другой интерфейс, вы можете гарантировать, что пользователи здесь не ошибаются.
Как
public T GetFromCache<T>(string key, Func<T> ifnotfound)
{
T obj = this.GetFromCache(key) as T;
if(obj == default(T))
{
obj = ifnotfound.Invoke();
this.StoreInCache(key, obj);
}
return obj;
}
Это гарантирует, что
- Мы всегда работаем с правильным типом
- То, что ваш пользователь всегда работает с кешем таким же образом
Эрго: менее вероятно, что они совершают ошибку. Кроме того: вы получаете более понятный, понятный код, например:
List<MyEntity> list = new CacheManager(CacheGroups.Total).GetFromCache<List<MyEntity>>("function1result", ()=>DAO.Foo());
Ответ 2
Это большой вопрос, но вот несколько советов:
- Не кэшируйте данные, которые вряд ли будут повторно использоваться, например данные, специфичные для пользователя.
- Кэш на всех уровнях: клиент, Silverlight (изолированное хранилище), прокси, http.sys, IIS, объект кэша ASP.NET, кеш-запрос ASP.NET, SQL Server
- Используйте SqlDependency/SqlCacheDependency, когда можете, но не переусердствуйте
- Избегайте состояния сеанса; вместо этого используйте файлы cookie, если вы можете
- Использование кэширования выходных данных и контроля (фрагмента)
- Рассмотрите возможность использования проверки кэша при необходимости
- Рассмотрим легкие альтернативы объекту кэширования ASP.NET, такие как слабая память refs
- При правильном использовании SQL Server может действовать как большой кеш
В случае, если это помогает, я подробно расскажу об этом в моей книге: Ультра-быстрый ASP.NET.
Ответ 3
Команда MS Patterns and Practices создала корпоративную библиотеку в качестве ответа на этот вопрос для целого ряда сценариев. EntLib включает в себя кэширование, а также обработку данных, проверку, регистрацию, обработку исключений и т.д. Мы использовали его в течение многих лет и не думали бы начинать новый проект без него.
http://www.codeplex.com/entlib
Как и домашняя страница P & P, http://msdn.microsoft.com/en-us/practices/default.aspx