Кэширование — это технология, которая сохраняет часто используемые данные/информацию в памяти, чтобы в следующий раз, когда те же данные/информация потребуются, их можно было извлечь непосредственно из памяти, а не генерировать снова из приложения.
Кэширование очень важно для повышения производительности ASP, поскольку страницы и элементы управления ASP генерируются динамически. Это чрезвычайно важно для данных, связанных с взаимодействием, поскольку время ответа очень ценно.
На носителях, к которым требуется быстрый доступ, например в оперативной памяти компьютера, в кэшах размещаются часто используемые данные. Среда выполнения ASP содержит пары «ключ-значение», называемые кэшированными объектами CLR. Он находится внутри приложения и доступен через HttpContext и System.Web.UI.Page.
В некотором смысле кэширование и хранение объектов состояния схожи. Однако информация, хранящаяся в объекте состояния, является детерминированной. Например, вы можете вычислить данные, хранящиеся в объекте состояния, но кэшированные данные не являются детерминированными.
Данные недоступны в следующих случаях:
Если его жизненный цикл завершился,
Если приложение освобождает память,
Если по каким-то причинам кэш не заменяется.
Вы можете использовать индексатор для доступа к элементам в кеше, а также контролировать время жизни объектов в кеше и устанавливать связь между кешированными объектами и их физическими ресурсами.
ASP предоставляет следующие различные типы кэша:
Выходной кэш : выходной кэш может хранить копию последней визуализированной веб-страницы или частичную страницу, отправленную клиенту. В следующий раз, когда клиент запрашивает страницу, клиенту отправляется кэшированная копия страницы вместо повторного создания страницы, что экономит время.
Кэширование данных . Кэширование данных означает кэширование данных из источника данных. Пока кэш не был заменен, данные будут получены из кэша при повторном запросе. При замене кеша новые данные извлекаются из источника данных, и кеш снова заполняется.
Кэш объектов . Кэш объектов предназначен для кэширования объектов страницы, таких как элементы управления с привязкой к данным и т. д. Кэшированные данные размещаются в памяти сервера.
Кэширование классов : при первом запуске веб-страницы или веб-службы собираются скомпилированные классы страниц. Затем сборка кэшируется на сервере. При следующем запросе страницы или службы будет использоваться кэшированная сборка. При изменении исходного кода CLR перекомпилирует сборку.
Кэш конфигурации : информация о конфигурации приложения хранится в файле конфигурации. Кэш конфигурации хранит информацию о конфигурации в памяти сервера.
В этом уроке мы рассмотрим кэширование вывода, кэширование данных и кэширование объектов.
Рендеринг страницы может включать в себя некоторые сложные процессы, такие как доступ к базе данных, рендеринг сложных элементов управления и т. д. Кэширование вывода позволяет обойти обращения к серверу путем кэширования данных в памяти. Даже всю страницу можно кэшировать.
Директива OutputCache отвечает за кэширование вывода. Он включает кэширование вывода и обеспечивает определенную степень контроля над его поведением.
Синтаксис директивы OutputCache:
<%@ OutputCache Duration="15" VaryByParam="None" %>
Поместите эту директиву под директивой страницы. Это сообщает среде, что страницу необходимо кэшировать на 15 секунд. Следующий обработчик событий загрузки страницы поможет подтвердить, была ли страница кэширована.
protected void Page_Load(object sender, EventArgs e){ Thread.Sleep(10000); Response.Write("Эта страница была создана и кэширована:" + DateTime.Now.ToString());}
Метод Thread.Sleep() останавливает процесс на определенный период времени. В этом примере поток останавливается на 10 секунд, поэтому первая загрузка страницы занимает 10 секунд. Однако в следующий раз, когда вы обновите страницу, это не займет много времени, поскольку страница уже получена из кеша и не будет загружена повторно.
Директива OutputCache имеет следующие функции, помогающие контролировать поведение выходного кэша:
свойство | ценить | описывать |
---|---|---|
ДискКэшируемый | правда/ложь | Описывает, можно ли записать выходные данные на диск с кешем. |
Нет магазина | правда/ложь | Описывает, отправляется ли заголовок кэша «нет хранилища». |
Профиль кэша | Строковое имя | Имя файла конфигурации кэша, хранящегося в web.config. |
ВариБиПарам | Нет*Имя параметра | Используйте строковые значения, разделенные точкой с запятой, в запросах GET или значения переменных в запросах POST. |
VaryByHeader | *Имя файла заголовка | Это может быть строка, разделенная точкой с запятой, определяющая заголовки, отправленные клиентом. |
VaryByCustom | Пользовательская строка браузера | Уведомляйте ASP.NET об изменениях в выходном кэше через версию имени браузера или строку клиента. |
Расположение | Любой клиентский сервер потоковой загрузкиНет | Любая: страница может кэшироваться где угодно. Клиент: кэшированное содержимое включается в поток загрузки браузера. Кэшированное содержимое сохраняется в потоке загрузки и на сервере. Сервер: кэш сохраняется только на сервере. Нет: кэширование не допускается. |
Продолжительность | число | Количество секунд для кэширования страницы или операции. |
Давайте добавим текстовое поле и кнопку к предыдущему примеру, а также добавим обработчик событий для этой кнопки.
protected void btnmagic_Click(object sender, EventArgs e){ Response.Write("<br><br>"); Response.Write("<h2> Привет, " + this.txtname.Text + "</h2>") ;}
Измените директиву OutputCache:
<%@ OutputCache Duration="60" VaryByParam="txtname" %>
Когда программа выполняется, ASP кэширует страницу на основе имени в текстовом поле.
Основным аспектом кэширования данных является кэширование управления источником данных. Мы обсудили элементы управления источниками данных, которые представляют данные из источника данных, например базы данных или XML-файла. Эти элементы управления являются производными от абстрактного класса DataSourceControl и имеют следующие унаследованные свойства для кэширования:
Период кэширования — время, в течение которого источник данных кэширует данные.
Политика истечения срока действия кэша — определяет поведение кэша при истечении срока действия данных в кэше.
Зависимость значения кэша — определяет значение управления, которое автоматически перемещает данные из кэша по истечении срока его действия.
Включить кэширование. Вы можете проверить, кэшируются ли данные.
Чтобы продемонстрировать кэширование данных, мы создаем новый веб-сайт и добавляем на него новую веб-форму. Добавьте в базу данных элемент управления SqlDataSource, который подключается к руководству по доступу к данным.
В этом примере мы добавляем на страницу метку, которая отображает время ответа страницы.
<asp:Label ID="lbltime" runat="server"></asp:Label>
За исключением этого тега, вся страница такая же, как в руководстве по доступу к данным. Добавьте на эту страницу обработчик событий, чтобы скачать время.
protected void Page_Load(object sender, EventArgs e){ lbltime.Text = String.Format("Страница опубликована в: {0}", DateTime.Now.ToLongTimeString());}
Разработанная страница должна выглядеть так:
Когда вы запускаете страницу в первый раз, ничего особенного не происходит. Отображение метки: каждый раз, когда страница обновляется, страница перезагружается, и на метке будет отображаться изменение времени.
Затем установите для свойства EnableCaching элемента управления источником данных значение «true», а для свойства Cacheduration — значение «60». Он будет реализовывать кеширование, и срок действия кеша будет истекать каждые 60 секунд.
Каждый раз, когда он обновляется, временная метка будет меняться. Но если вы измените данные в таблице в течение 60 секунд, они не будут отображаться до истечения срока действия кеша.
<asp:SqlDataSource ID = "SqlDataSource1" runat = "server" ConnectionString = "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString %>" ProviderName = "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString.ProviderName %>" SelectCommand = "SELECT * FROM [DotNetReferences]" ВключитьКэширование = «истина» CacheDuration = "60"> </asp:SqlDataSource>
Кэширование объектов обеспечивает большую гибкость, чем другие технологии кэширования. Вы можете использовать кэширование объектов, чтобы поместить в кэш любой объект. Объекты также могут быть любого типа — типы данных, сетевые элементы управления, классы, объекты настроек данных и т. д. Эти элементы можно добавить в кеш, просто присвоив им значение, как показано ниже:
Cache["key"] = item;
Для вставки объектов в кэш ASP предоставляет метод Insert(). Существует четыре перегруженных версии этого метода. Давайте посмотрим:
Перегрузка | описывать |
---|---|
Cache.Insert((ключ, значение); | Вставляйте в кеш в виде пар ключ-значение, причем приоритет и жизненный цикл являются значениями по умолчанию. |
Cache.Insert(ключ, значение, зависимости); | Вставляйте кеш в кеш в виде пар ключ-значение с приоритетами и временем жизни по умолчанию, а также зависимостями кеша, связанными с другими файлами или содержимым, чтобы изменения кеша больше не были ограничены. |
Cache.Insert(ключ, значение, зависимости, AbsoluteExpiration, скользящееExpiration); | Укажите срок действия вышеуказанной конфигурации. |
Cache.Insert(ключ, значение, зависимости, AbsoluteExpiration, скользящееExpiration, приоритет, onRemoveCallback); | Наряду с настройкой он также позволяет устанавливать приоритет кэшированного контента и делегирование, указывая метод, который будет вызываться при удалении объекта. |
Динамический жизненный цикл используется для удаления элемента кэша, который недействителен в течение определенного периода времени. Следующий фрагмент кода сохраняет элемент кэша без зависимостей со скользящим временем жизни 10 минут:
Cache.Insert("my_item", obj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));
Создайте страницу, используя только кнопку и метку. Напишите следующий код в событии загрузки страницы:
protected void Page_Load(object sender, EventArgs e){ if (this.IsPostBack) { lblinfo.Text += "Страница опубликована обратно.<br/>" } else { lblinfo.Text += "страница создана.<br/> "; } if (Cache["testitem"] == null) { lblinfo.Text += "Создание тестового элемента.<br/>"; DateTime testItem = DateTime.Now; lblinfo.Text += "Сохранение тестового элемента в кеше"; lblinfo.Text += "в течение 30 секунд.<br/>"; Cache.Insert("testItem", testItem, null, DateTime.Now.AddSeconds; (30), TimeSpan.Zero); } else { lblinfo.Text += "Получение тестового элемента.<br/>"; = (DateTime)Cache["testitem"]; lblinfo.Text += "Тестовый элемент: " + testItem.ToString(); lblinfo.Text += "<br/>"; } lblinfo.Text += "<br />";}
Когда страница загружается в первый раз, на ней отображается:
Страница создана. Создание тестового элемента. Сохранение тестового элемента в кеше в течение 30 секунд.
Если вы снова нажмете кнопку в течение 30 секунд, хотя страница будет удалена, элемент управления меткой получит информацию из кеша, как показано ниже:
Страница отправлена назад. Получение тестового элемента. Тестовый элемент: 14-07-2010 01:25:04