Кэш объектов или вывод данных: что лучше? - PullRequest
2 голосов
/ 29 мая 2010

У меня есть электронная коммерция, работающая в ASP.Net MVC. Я использую кеширование для повышения производительности своих страниц, и это работает.

Я бы связался, чтобы узнать, что обеспечивает лучшую производительность, например, я могу установить OutputCache в своих представлениях и использовать этот кеш для всех страниц ИЛИ Я мог бы получить свой Список продуктов в контроллере это в кеше (как в коде ниже) и отправить его в View для визуализации для пользователя?

private IEnumerable<Products> GetProductsCache(string key, ProductType type)
        {
            if (HttpContext.Cache[key] == null)
                HttpContext.Cache.Insert(key, ProductRepository.GetProducts(type), null, DateTime.Now.AddMinutes(10), Cache.NoSlidingExpiration);

            return (IEnumerable<Products>)HttpContext.Cache[key];
        }

public ActionResult Index()
        {
            var home = new HomeViewModel()
                           {
                               Products = GetProductsCache("ProductHomeCache", ProductType.Product)
                               Services = GetProductsCache("ServiceHomeCache", ProductType.Service)
                           };

            return View(home);
        }

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

Ответы [ 3 ]

2 голосов
/ 29 мая 2010

В вашем примере, как указал Иван, выходное кэширование будет немного лучше с точки зрения производительности. Но только немного.

По моему опыту, большая часть прироста производительности достигается за счет кэширования данных. Обработка страниц - относительно недорогая операция, однако вызовы базы данных - нет. Поэтому я всегда gzip и сбрасываю свои данные в кеш, раздувая, когда получаю их из кеша. У Хансельмана есть хороший пример кэширования на молнии, если вы заинтересованы: http://www.hanselman.com/blog/CommentView.aspx?guid=aa479008-3d1e-45fc-b89f-e9c2ffc199c1

Кроме того, кэширование вывода в mvc может быть немного сложным. Для кэширования всей страницы все в порядке, просто используйте атрибут [OutputCache]. Однако, если вы хотите кэшировать только частичные файлы (что вы делаете в большинстве случаев), это становится немного сложнее.

Надеемся, что кэширование - это то, что MS улучшит в mvc 3.

1 голос
/ 29 мая 2010

На реальном сайте ASP.NET MVC у вас вряд ли будет возможность использовать OutPutCache.

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

Фил Хаак писал о кэшировании пончиков, но в MVC2 http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx

это оказалось невозможным. Часто я начинал использовать OutputCaching, не задумываясь об этомпользовательские детали все забыли.

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

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

1 голос
/ 29 мая 2010

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

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

Также будьте осторожны с выбором времени кеширования! Я бы посоветовал вам создать свое приложение с чувством способности кешировать , но не кешируйте, если не будете полностью уверены, что выполнение чего-либо займет много времени (может быть, ваш метод нуждается в улучшении?). После того, как ваш проект будет готов, профилируйте его и поместите кеш там, где это необходимо!

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...