Кэширование в ColdFusion

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

Существует два основных способа кэширования в ColdFusion: в CFML и в настройках в Административной оболочке ColdFusion. В CFML вы можете производить кэширование на уровне запросов или на уровне страницы. На уровне запросов вы можете использовать атрибуты cachedwithin или cachedafter тега cfqeury. На уровне страницы следует использовать тег cfcache. В Административной оболочке ColdFusion есть 3 настройки, относящиеся к кэшированию. Все эти темы будут рассмотрены в этой статье.

 

Кэширование на уровне запроса

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

Хорошие кандидаты для кэширования - это запросы, которые: Одним из методов кэширования запросов является использование атрибутов cachedwithin или cachedafter тега cfqeury. Эта техника позволяет нам кэшировать запросы в течении определенного времени. Приведенная ниже таблица показывает положительные и отрицательные стороны такого кэширования.

преимущества недостатки
  1. Может сильно повысить производительность;
  2. Легко применим;
  3. Хорошо подходит для динамических страниц.
  1. Использует неопределенные и неконтролируемые размеры памяти, кроме того, вы можете ограничить количество кэшированных запросов, но не размер занимаемой ими памяти;
  2. Вы не можете управлять ими напрямую.

 

Использование атрибута cachedwithin

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

Заметьте: Синтаксис функции CreateTimeSpan() такой: CreateTimeSpan(дни, часы, минуты, секунды).

Когда вы кэшируете запрос, то затем можете обращаться к нему, используя тот же синтаксис запроса, соблюдая следующие правила:

Когда пользователь открывает страницу в первый раз, то следующие данные отображаются в отладочной информации:
Когда пользователь снова открывает ту же страницу, то в отладочной информации будут такие данные:
SQL Queries

qCountry (Datasource=devnet, Time=0ms, Records=9, Cached Query) in
C:\CFusionMX\wwwroot\devnet_cache_development\cachedwithin.cfm @ 05:12:48.048
SELECT Country_ID, Country_Name
FROM Country
ORDER BY Country_Name ASC
Обратите внимание, что время выполнения запроса изменилось с 110 миллисекунд до 0, а также было определено, что запрос кэширован. ColdFusion кэширует этот запрос на одни день (как указано в функции CreateTimeSpan()). После того, как время кэширования пройдет, пользователю снова придется немного подождать, пока запрос будет снова выполнен и кэширован.

 

Использование атрибута cachedafter

Используйте атрибут cachedafter тогда, когда вам нужно обновлять кэш каждый день в определенное время. Если большие объемы данных записываются в базу данных каждый день с 24 до 2 часов ночи, то вы можете обновлять кэш каждый день в 2 часа ночи и использовать его весь день до 24 часов.

С атрибутом cachedafter обычно используются следующие функции: Вот пример тега cfquery, который кэширует запрос и обновляет его каждый день в 2 часа ночи:
Обратите внимание: атрибут cachedafter разделяет день на две части. С 24 до 2 часов ночи кэширование не происходит. При первом запросы страныцы после 2 часов ночи, ColdFusion кэширует запрос и использует его до 24 часов ночи.

 

Обновление кэша и показ новых данных

Вы можете в любой момент обновить кэшированный запрос, указав нули в функции CreateTimeSpan():

 

Ограничение количества кэшируемых запросов

В Административной оболочке ColdFusion вы можете управлять общим количеством кэшируемых запросов. Для этого вам нужно открыть раздел SETTINGS/Caching и вы увидите такое поле для ввода настроек:

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

 

Кэширование отображаемых данных

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

 

Использование тега cfcache

Если вам нужно кэшировать определенную страницу, используйте тег cfcache. Когда вы используете этот тег для кэширования на стороне сервера, то ColdFusion сохраняет полученный HTML код и использует его при последующих запросах к той же странице. Например, посмотрите на следующий CFML код:

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

 

Рассмотрим тег cfcache подробнее

Тег cfcache имеет несколько атрибутов. Два из них вы уже заметили в приведенном выше примере - это action и timespan. Атрибут action может иметь следующие значения:

Тег cfcache достаточно "умен", чтобы понять, что одной и тоже странице через адресную строку передаются разные параметры и ColdFusion создает кэшированные страницы для каждого уникального запроса. Например, на главной странице у вас есть следующий код:
Если в файле cfcache_test.cfm есть следующий тег cfcache:
то ColdFusion закэширует три разные страницы, в соответствии с запросами через адресную строку.

 

Кэширование на стороне сервера

Когда ColdFusion обрабатывает тег cfcache с атрибутом action="servercache", то происходят следующие действия:

 

Кэширование на стороне клиента

Более эффективным будет использование уже запрашиваемой страницы на стороне клиента, а не на стороне сервера, т.к. это снимает нагрузку с ColdFusion сервера. Чтобы включить кэширование на стороне клиента, следует в теге cfcache указать атрибут со значением cache (кэширование на стороне сервера и клиента) или optimal (то же, что и cache) или clientcache, т.к. любое из этих значений подразумевают кэширование на стороне клиента.

Кэширование на стороне сервера осуществляется с помощью стандартного механизма HTTP кэширования, поддерживаемого веб серверами и браузерами. Большинство браузеров хранят кэш недавно посещенных страниц и HTTP протокол дает знать, когда следует использовать кэшированные данные вместо того, чтобы еще раз запрашивать их с сервера. Веб сервера обычно автоматически кэшируют статические файлы типа HTML, JPEG и т.д., просматривая дату их последнего изменения. Тег cfcache делает возможным кэшировать динамические CFML файлы. Когда кэширование на стороне клиента включено, ColdFusion добавляет к HTTP ответу заголовок "Last-Modified". Браузер отмечает свой кэш этого файла датой, указанной в заголовке "Last-Modified". Затем, когда он в следующий раз запросит этот адрес, он добавит к HTTP запросу заголовок "If-Modified-Since" с указанной ранее датой.

Тег cfcache проверяет 3 следующих условия:

Если все эти три условия верны, то ColdFusion возвращает 304 HTTP ответ, который говорит браузеру использовать его кэшированные данные.

 

Указываем продолжительность кэширования файла

Продолжительность кэширования файла можно указать в атрибуте timespan. В этом атрибуте следует использовать функцию CreateTimeSpan(), синтаксис которой такой: CreateTimeSpan(дни, часы, минуты, секунды).

 

Обновляем кэшированные страницы

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

Такое действие удалит все файлы вида cfcache_HASH.tmp. Если вы не используете атрибут directory, то будут удалены файлы в каталоге C:\CFusionMX\cache. Если же вы укажите определенную директорию, то файлы будут удалены именно в ней.

Если вы хотите обновить определенный файл, используйте атрибут action="flush" в сочетании с атрибутом expireurl. Таким образом, если вы хотите очистить кэш ассоциированный с файлом cfcache1_example.cfm, то следует выполнить следующий код:

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

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

Это действие удалит все файлы cfcache_test.cfm, в которые был передан параметр x, равный любому значению.

 

Кэширование страниц ColdFusion

Перед первым просмотров ColdFusion страницы, CFML файл компилируется в Java класс и сохраняется на диск. Затем, этот файл компилируется только тогда, когда в нем будут сделаны изменения. Данный компилированный класс используется для создания HTML файла, который отправляется обратно пользователю. Вместо того, чтобы при каждом запросы страницы обращаться к компилированному Java классу, ColdFusion кэширует некоторые или все Java классы.

Есть две настройки, которые регулируют этот вид кэширования:

 

Устанавливаем максимальное количество кэшированных Java классов

Чтобы убедиться в правильности настроек кэширования, сначала нужно посмотреть опцию "Template cache size (number of templates)", которая находится в Административной оболочке ColdFusion в разделе SETTINGS/Caching:

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

 

Включаем доверительное кэширование

По-умолчанию, перед тем как ColdFusion использует Java класс, потребуется немного времени, чтобы проверить, не был ли изменен оригинальный CFM файл с тех пор как был кэширован. Если у вас хорошо зарекомендованный сайт, который не подвергается изменениям, то нет смысла тратить время на эту проверку. Чтобы отключить эту проверку, вам нужно в Административной оболочке в разделе SETTINGS/Caching включить опцию "Trusted cache" - доверительное кэширование. Опция выглядит так:

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

 

Заключение

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


Источник: Caching in ColdFusion

 


Hosted by uCoz