Rails: Запланированное задание на разогрев кеша? - PullRequest
6 голосов
/ 12 марта 2011

Я использую следующее для кэширования медленной загрузки страницы с использованием memcached:

caches_action :complex_report, :expires_in => 1.day

Действие контроллера защищено аутентификацией Devise.

В настоящее время страница кэшируется при первом запросе пользователем. Последующий запрос в тот же день извлекается из кэша.

Проблема в том, что первоначальный запрос загружается за 20-30 секунд. Можно ли заранее заполнить кэш с помощью запланированного задания?

Любые предложения очень ценятся.

Ответы [ 4 ]

5 голосов
/ 29 марта 2011

Вот расширение предыдущего решения на основе cron, которое использует способность curl хранить куки, чтобы вы могли авторизоваться за один шаг, а затем снова использовать куки как аутентифицированный пользователь на следующем шаге.Поэтому, если вы поместите эти строки в скрипт с именем "prepare_cache.sh"

rm /tmp/cookiejar
curl --request POST -d "login=<username>" -d "password=<password>" -c /tmp/cookiejar http://yourwebpages.url/login
curl --request GET -b -c /tmp/cookiejar http://yourwebpages.url/page_to_cache
rm /tmp/cookiejar

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

Затем вы можете вызвать этот скрипт с помощью задания cron:

*/15 * * * * /home/myname/prepare_cache.sh > /dev/null 2>&1

И, надеюсь, это должно сработать.Казалось, работает на меня, когда я попробовал.

3 голосов
/ 29 марта 2011

Взгляните на этот камень:

https://github.com/tommyh/preheat

Этот камень предназначен для предварительного нагрева вашего Rails.cache.

Из документации: This will "preheat" all your Rails.cache.fetch calls on your homepage. It is as simple as that!

    #app/models/product.rb
    def slow_method
      Rails.cache.fetch("product-slow-method-#{self.id}") do
        sleep 15
        Time.now
      end
    end

    #lib/tasks/preheat.rake
    namespace :preheat do
      desc "Preheat product caches"
      task (:products => :environment) do
        Preheat.it do
          Product.all.each do |product|
            app.get(app.products_path(product)) #or you could just call product.slow_method directly, whatever makes more sense
          end
        end
      end
    end

    #crontab -e
    0 * * * * /path/to/rake preheat:products RAILS_ENV=production 2>&1 >> #{Rails.root}/log/preheat.log &
3 голосов
/ 29 марта 2011

Если процесс запуска отчета и сбора результатов занимает много времени, вы можете кэшировать эти результаты (вместо кэширования действий или параллельно), используя Rails.cache.write и Rails.cache.read.

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

3 голосов
/ 13 марта 2011

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

*/15 * * * * wget -q <a href="http://yourwebpages.url/" rel="nofollow">http://yourwebpages.url/</a> > /dev/null 2>&1

Для этого нужно использовать wget для получения данных по указанному URL каждые 15 минут каждого часа, дня, месяца и года, игнорировать результаты и не отправлять * nix почту в случае, если что-то пойдет не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...