Каковы шаблоны и рекомендации по кэшированию в 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