Каковы шаблоны и лучшие практики для кэширования в ASP.NET?

Вне всякого сравнения был предложен неоднократно мне.

12
задан Stilgar 20 November 2009 в 08:30
поделиться

3 ответа

  • Просто сохраните каждый результат запроса в базе данных (с ключом кеша: ваш запрос, значение: ваш список бизнес-объектов)
  • Используйте распределенный кеш, например memcached, рядом с кешем ASP.Net
  • Используйте сложный диспетчер кеша, например https://github.com/enyim/memcached-providers ; которые могут иметь кеш-группы. Некоторые данные должны храниться долго, некоторые - непродолжительное время. Некоторые данные должны храниться в кэше ASP.Net и т. Д.
  • Выполнять вызовы, которые должны храниться в кеше, с использованием функции-оболочки, например public T GetFromCache (строковый ключ, Func 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;
}

Это гарантирует, что

  1. Мы всегда работаем с правильным типом
  2. Ваш пользователь всегда работает с кешем одинаково.

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

List<MyEntity> list = new CacheManager(CacheGroups.Total).GetFromCache<List<MyEntity>>("function1result", ()=>DAO.Foo());
19
ответ дан 2 December 2019 в 06:45
поделиться

Это серьезная тема, но вот несколько советов:

  1. Не кэшируйте данные, которые вряд ли будут использоваться повторно, например, пользовательские данные
  2. Кэшировать на всех уровнях : клиент, Silverlight (изолированное хранилище), прокси, http.sys, IIS, объект кэша ASP.NET, кеш ASP.NET по запросу, SQL Server
  3. Используйте SqlDependency / SqlCacheDependency, когда можете, но не переусердствуйте. использовать
  4. Избегать состояния сеанса; вместо них используйте файлы cookie, когда вы можете
  5. Использовать кэширование вывода страниц и элементов управления (фрагментов)
  6. Рассмотрите возможность использования проверки кеша при необходимости
  7. Рассмотрите упрощенные альтернативы объекту кеширования ASP.NET, такие как слабые ссылки на память
  8. При правильном использовании SQL Server может действовать как большой кеш

Если это помогает, я подробно освещаю эту тему в своей книге: Сверхбыстрый ASP.NET .

3
ответ дан 2 December 2019 в 06:45
поделиться

Команда MS Patterns and Practices создала Enterprise Library в качестве ответа на этот вопрос для множество обычных сценариев. EntLib включает в себя кэширование, а также доступ к данным, проверку, ведение журнала, обработку исключений и т. Д. Мы использовали его годами и не думали бы начинать новый проект без него.

http://www.codeplex.com / entlib

Помимо домашней страницы P&P, http://msdn.microsoft.com/en-us/practices/default.aspx

1
ответ дан 2 December 2019 в 06:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: