Опубликован: 30.01.2013 | Уровень: для всех | Доступ: платный
Лекция 9:

Способы увеличения производительности

Кэширование данных

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

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


В случае если необходимые данные отсутствуют в кэше, то обращение к объекту Cache с заданным ключом вернет значение "null". Поэтому, стандартная логика работы с кэшем сводится к следующему алгоритму: в момент загрузки страницы проверяется содержимое кэша по нужному ключу, если нужные данные содержаться в кэше, то они отображаются пользователю; если данных в кэше нет, то производится выполнение операции по получении данных и сохранение их в кэш. Этот сценарий может быть реализован следующим образом.


Как видно, для добавления данных в кэш используется непосредственное обращение по ключу. Однако, объект Cache позволяет сохранять данные в кэше более гибко и эффективно. Для этого можно использовать метод Insert, который содержит ряд дополнительных параметров. Определение метода Insert объекта Cache выглядит следующим образом.


Как видно, первые два параметра (key и value) по аналогии с приведенными ранее примерами задают ключ и кэшируемый объект.

Следующим параметром (CacheDependency) задаются зависимости кэша. Зависимости предназначены для борьбы с устареванием данных в кэше. Зависимости – это специальные объекты .NET Framework, которые отслеживают внешние изменения данных и, если это произошло, удаляют текущий ключ вместе с данными из кэша. В стандартной поставке ASP.NET можно задать зависимости кэша на таблицу в базе данных, файл, папку или другой ключ кэша. При этом если объект (например, файл), на который указывает зависимость изменится или удалится, то данный ключ также немедленно удалится из кэша. Кроме того, используя класс AgregateCacheDependency можно устанавливать агрегатные зависимости, т.е. зависимости на несколько источников.

Следующие два параметра (absTime и slidingTime) задают время жизни данных в кэше. Первый параметр предназначен для задания абсолютного времени, когда данный ключ должен быть удален из кэша. Примером такого значения может быть "10 января 2009 года, 11 часов 13 минут 00 секунд". Второй параметр задает "скользящее" время жизни ключа в кэше. Например, это значением может равняться 30 секундам; при этом если в течении указанного времени происходит обращение к этому ключу, то время жизни ключа в кэше снова устанавливается равным 30 секундам и т.д. Таким образом, данный ключ будет удален из кэша, если в течение всего этого времени не было ни одного обращения к данному ключу в кэше. В конкретном случае должен использоваться только один из предложенных параметров определения времени жизни данных в кэше. При этом другой параметр должен быть равен либо значению Cache.NoAbsoluteExpiration, либо Cache.NoSlidingExpiration соответственно (в зависимости от того, какой параметр используется).

Следующий параметр (priority) позволяет задать приоритет данного ключа в кэше. Приоритет используется в случае, если произошло переполнение кэша, и был запущен механизм автоматической очистки кэша. В этом случае ищутся наименее приоритетные ключи и удаляются. В случае если найдено два ключа с минимальным приоритетом, причем приоритет этих ключей равный – удаляется наиболее "старый" из них.

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


Таким образом, первоначальный код для работы с объектом Cache можно модифицировать следующим образом.


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

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

Краткие итоги

Кэширование данных – альтернативный подход к кэшированию, реализованный в рамках ASP.NET. Для кэширования данных используется глобальный объект Cache. Этот объект представляет собой коллекцию "ключ-значение". Каждый кэшируемый объект ассоциируется с уникальным ключом. Для сохранения данных в кэше используется метод Insert, который позволяет определить зависимости кэша, время жизни, приоритет и метод обратного вызова.

Контрольные вопросы

  • С какими проблемами производительности сталкиваются разработчики веб-приложений?
  • Каким образом проблемы производительности решаются на уровне веб-сервера IIS7?
  • Что такое кэширование?
  • Как кэширование позволяет увеличить производительность приложения?
  • Как решается проблема устаревания данных в кэше?
  • Что такое кэширование выходного потока?
  • Какие параметры имеет директива OutputCache и для чего они предназначены?
  • Что такое фрагментарное кэширование?
  • Что такое послекэшевая подстановка?
  • Чем кэширование данных отличается от кэширования выходного потока?
  • С помощью какого глобального объекта осуществляется кэширование данных?
  • Какие параметры доступны в рамках метода Insert объекта Cache и что они означают?
  • Чем абсолютное время жизни данных в кэше отличается от скользящего?
  • Что такое зависимости кэша?
  • Для чего необходим приоритет при добавлении данных в кэш?
  • Для чего необходим метод обратного вызова при добавлении данных в кэш? Приведите примеры использования.
Марина Воробьева
Марина Воробьева
Виктория Ткаченко
Виктория Ткаченко

Проигрыватель не работает. После нажатия кнопки Play ничего не происходит.

Азиз Рахимов
Азиз Рахимов
Россия, М/О Ленинская район г.Видное ул.Центральная д.32
Борис Логунов
Борис Логунов
Россия, Moscow