Rails: запланированная задача для разогрева кэша?

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

caches_action :complex_report, :expires_in => 1.day

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

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

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

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

4 ответов


вот расширение предыдущего решения на основе 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

и, надеюсь, это должно сработать. Похоже, сработало, когда я попробовал.


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

*/15 * * * * wget -q http://yourwebpages.url/ > /dev/null 2>&1

что это будет делать, это использовать wget чтобы получить данные по предоставленному url каждые 15 минут каждого часа, дня, месяца и года, игнорировать результаты и не отправлять * Nix mail в случае, если что-то идет неправильный.


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

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


взгляните на этот перл:

https://github.com/tommyh/preheat

самоцвет для подогревать ваши рельсы.кэш.

из документации: 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 &