Стратегия кеширования, выходной кэш против кеша данных или и то, и другое?

Я работаю над проектом ASP.NET MVC и дошел до того момента, когда хочу начать обдумывать свою стратегию кэширования. Я старался оставить свой фреймворк максимально открытым для использования в кешировании.

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

Итак, для стратегии кеширования. Что следует использовать: кэширование вывода, кеширование данных или их сочетание? Мои первые мысли - оба, но что касается зависимостей кеша, похоже, что это может стать немного сложным.


person Chad Moran    schedule 17.02.2009    source источник


Ответы (2)


Будьте осторожны с чрезмерно агрессивным кешированием. Хотя кеширование - это инструмент для повышения производительности, при неправильном использовании оно может фактически ухудшить производительность.

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

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

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

Так что, в конце концов, это действительно зависит от ваших потребностей, и будьте осторожны при неправильном использовании кеширования.

person ajma    schedule 17.02.2009
comment
Посмотрите на Kigg (codeplex.com/Kigg) пример приложения ASP.NET MVC, которое клон digg. если ваше приложение в точности похоже на клон digg, я бы вывел в кеш страницы историй и домашнюю страницу. кэширование пользовательской информации может потребоваться в зависимости от того, как выглядят ваши структуры данных. - person ajma; 18.02.2009

Мы делаем кеширование API и вывода на крупномасштабных (3 миллиона посещений в день) веб-сайтах (новостных порталах). Сайт в основном используется анонимными пользователями, но у нас есть аутентифицированные пользователи, и мы кэшируем весь сайт только для них из-за некоторых персонализированных частей сайта, и я должен признать, что у нас не было абсолютно никаких проблем с нехваткой памяти.

Итак, мой совет - кэшировать все, что вы можете, в кеш API, чтобы восстановление кеша вывода было еще быстрее.

Конечно, обратите особое внимание на значения коэффициента кэширования в счетчиках производительности. Вы должны увидеть число> 95% кешированных обращений.

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

В итоге, кеширование - одна из лучших функций ASP.NET, она выполнена великолепно, и вы можете на нее положиться.

person markom    schedule 17.02.2009
comment
Вы используете веб-ферму? Если да, то есть ли у каждого веб-сервера свой собственный кэш внутрипроцесса, независимый от других веб-серверов? - person frankadelic; 23.02.2010