Заполнить кеш в Rails вручную

В Rails 3.x я хочу предварительно скомпилировать кеш вручную и использую кеширование фрагментов в представлениях экземпляров модели и статического HTML.

Rails лениво заполняет кеш при запросе страницы, что приводит к медленной загрузке при первой загрузке.

Итак, учитывая этот пример кода:

  <% cache("index_chart") do %>
    <%= high_chart("chart", @h) %>  
  <% end %>

Как я могу вручную заполнить кеш с помощью Ruby?


person Kenny Meyer    schedule 25.02.2013    source источник


Ответы (1)


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

Простая установка - это создание сценария оболочки с именем scripts / cache_warmer в вашем приложении, после чего вы можете запускать его вручную из командной строки вашего сервера, из сценария развертывания или из фонового процессора, такого как resque.

# Sample scripts/cache_warmer

GET http://localhost/
GET http://localhost/some_other_page

Альтернатива, если вы хотите, чтобы он был немного умнее. Например, возможность попасть по URL-адресам участников для ресурса будет означать использование задачи с граблями.

# lib/tasks/cache_warmer.rake

task :cache_warmer => :environment do
  Resource.all.each do |resource|
    Net::HTTP.get_response("http://localhost/resources/#{resource.id}")
  end
end

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

person Cluster    schedule 25.02.2013
comment
Большое спасибо за ваш вклад. Это действительно кажется утомительным способом разогреть кеш - лично я до сих пор не знаю другого - так что это нормально. :-) - person Kenny Meyer; 25.02.2013
comment
Как я уже сказал, это во многом зависит от того, как структурировано ваше приложение и в каких действиях у вас есть кеш-фрагменты. - person Cluster; 25.02.2013