在Rails中预编译/预加载缓存片段

4
使用Rails 3.1.1和Herkou
我的应用程序中有1,000个产品。它们都有一个非常慢的控制器,通过片段缓存可以有效解决这个问题。尽管数据不经常更改,但仍需要定期过期(我通过清除来实现),在我的情况下每周一次。
现在,在清除缓存视图之后,我不希望我的用户通过一个接一个地访问产品来创建新的片段(第一次加载大约需要6-8秒,缓存加载需要2-3秒)。我认为我可以使用某种脚本来处理,该脚本将逐个加载每个产品页面,从而使服务器创建这些片段。
我可以想象有三种方式来处理这个问题:
1. 在我的本地计算机上运行一个脚本,该脚本将尝试使用某种get命令访问每个url - 缺点:不太美观,并且会以我不喜欢的方式影响访客统计信息。
2. 在清除程序之后,在服务器上运行相同类型的脚本,该脚本将加载每个产品。在这种情况下,我该如何做?
3. 使用智能Rails命令自动完成此操作。是否有这样一个优雅的命令?

我自己也在处理类似的问题,发现除了缓存之外,还有其他优化代码以实现更快的初始加载时间的方法。您考虑过一些性能调整或将某些逻辑移至异步客户端请求吗? - Peter Brown
我正在处理多个解决方案,但目前缓存似乎是最好的方式... - Christoffer
也许你可以设置另一个虚拟主机(例如precache.mydomain.com),然后编写一个简单的脚本来访问该服务器,以避免将流量记录到日志中。关键是要确保公共服务器使用该服务器生成的片段。 - David Hempy
2个回答

0
创建一个脚本,作为rake任务或更好的工作者运行,并运行并curl页面。无需包含gem,只需调用curl即可。
`curl -A "CacheRefresher" #{ENV['HOSTNAME']}/api/v1/#{klass.name.underscore.pluralize}/#{id} >/dev/null 2>&1` 

听起来他想避免让非用户点击膨胀访问日志。这种方法会将所有额外的流量放入日志中。 - David Hempy
我认为试图规避这个问题会带来更多的问题。他可以在请求中添加一个用户代理,并确保将其从统计数据中过滤掉,就像处理其他任何机器人一样。curl -A“CacheRefresher” - SirWolfgang

0
我编写了这个脚本并且它可以工作。"product.slug"是因为我安装了friendly_id,它将产生类似www.mydomain.com/productabc-123/的url变量名称,这些名称将被Nokogiri读取(需要Nokogiri gem来实现此解决方案)。
请注意,在此解决方案中,我从片段缓存切换到操作缓存(与问题相反,在那里我使用片段缓存)。这是重要区别是在检查缓存时if Rails.cache.exist?('views/www.mydomain.com/' + product.slug)。对于片段缓存,应该是片段名称。
require 'nokogiri'
require 'open-uri'

Product.all.each do |product|
  url = 'http://www.mydomain.com/' + product.slug  
  begin      
    if Rails.cache.exist?('views/www.mydomain.com/' + product.slug)     
      puts url + " is already in cache"
    else
      doc = Nokogiri::HTML(open(url))
      puts "Reads " + url
# Verifies if the caching worked. Only for trouble shooting
      if Rails.cache.exist?('views/www.mydomain.com/' + product.slug)     
        puts "--->" + url + " is NOW in the cache"
      else
        puts "--->" + url + " is still not in the cache!"
      end
      sleep 1
    end
  rescue
    puts 'Normal rescue of ' + url
  rescue Timeout::Error
    puts 'Timeout rescue of ' + url
    puts 'Sleep for 5 sec'
    sleep 5
    retry
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接