Учебный курс по WebMatrix, глава 12. Кэширование и оптимизация производительности

Это продолжение учебного курса по WebMatrix. Предыдущие части руководство можно найти здесь:

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

Кэширование для улучшения отзывчивости сайта

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

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

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

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

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

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

Добавьте на сайт новую страницу WebCache .cshtml. Добавьте на страницу следующий код и разметку:

 @{
    var cacheItemKey = "Time";
    var cacheHit = true;
    var time = WebCache.Get(cacheItemKey);

    if (time == null) {
        cacheHit = false;
    }

    if (cacheHit == false) {
        time = @DateTime.Now;
        WebCache.Set(cacheItemKey, time, 1, false);
    }
}
<!DOCTYPE html>
<html>
<head>
    <title>WebCache Helper Sample</title>
</head>
<body>
    <div>
        @if (cacheHit) {
            @:Found the time data in the cache.
        } else {
            @:Did not find the time data in the cache.
        }
    </div>
    <div>
        This page was cached at @time.
    </div>
</body>
</html>

Когда вы кэшируете данные, вы кладете их в кэш, используя уникальное в рамках всего сайта имя. В нашем случае вы используете для имени элемента кэша значение Time. Это значение переменной cacheItemKey.

Этот код сначала получает значение элемента кэша Time. Если значение было возвращено (то есть значение не равно null), то код просто устанавливает переменную в это значение.

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

Этот код демонстрирует подход, которому вы должны всегда следовать при кэшировании данных. Перед извлечением данных из кэша всегда проверяйте, что WebCache.Get возвращает null. Запомните, что элемент кэша может быть удален из-за истечения периода кэширования или быть удален по другим причинам, так что нет никакой гарантии, что значение есть в кэше.

Запустите WebCache.cshtml в браузере (убедитесь, что страница выбрана в панели Files). При первом запросе к странице данных в кэше нет, так что коду приходится добавить значение в кэш.

image

Обновите страницу WebCache.cshtml в браузере. В этот раз данные будут в кэше. Обратите внимание, что время не изменилось с последнего посещения страницы.

image

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