我正在使用以下代码使用memcached缓存加载缓慢的页面:
caches_action :complex_report, :expires_in => 1.day
控制器操作受Devise身份验证保护。
当前页面在用户第一次请求时被缓存。随后的请求将从缓存中获取。
问题在于,初始请求需要20-30秒才能加载完毕。是否可以通过定期任务提前填充缓存?
非常感谢任何建议。
我正在使用以下代码使用memcached缓存加载缓慢的页面:
caches_action :complex_report, :expires_in => 1.day
控制器操作受Devise身份验证保护。
当前页面在用户第一次请求时被缓存。随后的请求将从缓存中获取。
问题在于,初始请求需要20-30秒才能加载完毕。是否可以通过定期任务提前填充缓存?
非常感谢任何建议。
以下是基于之前的cron解决方案的扩展,它使用curl的存储cookie功能,以便您可以在一步中进行身份验证,然后在下一步中再次使用cookie作为已验证的用户。因此,如果您将这些行放入名为“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
希望这样做能够起作用。当我尝试时,似乎对我有效。
看一下这个宝石:
https://github.com/tommyh/preheat
这个宝石是用于预热你的 Rails.cache。
从文档中可以得知:
这将在主页上“预热”所有的 Rails.cache.fetch 调用。就这么简单!
#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 &
Rails.cache.write
和Rails.cache.read
缓存这些结果(代替或与操作缓存一起)。然后,由于无需担心身份验证或向服务器发出请求,因此从cron作业运行查询并缓存结果的操作将更加简单。 crontab 来完成,在您的服务器上使用 crontab -e 打开编辑器:
* / 15 * * * * wget -q http://yourwebpages.url/ > / dev / null 2>&1
这将使用 wget 每小时,每天,每月和每年的每15分钟获取所提供的URL的数据,忽略结果并在出现问题时不发送*nix邮件。
current_user
。 - gjb