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 &