重新生成Rails缓存

时间:2011-10-21 16:22:47

标签: ruby-on-rails caching

有没有一种简单的方法来重新生成Rails页面缓存?销毁缓存非常简单:

Person.each.all do |person|
  expire_page(:controller => 'yql', :action => 'feed', :id => person.id)
end

这会删除公共目录中的缓存文件。在我摧毁它们之后,我想重新创建它们。我不想等到他们在公共网站上查看。

是否有一种简单的 rails 方法可以做到这一点。

非常感谢

3 个答案:

答案 0 :(得分:1)

所以,为了记录,这就是我所做的:

def recache
  Person.all.each do |person|
    path = MyApp::Application.config.action_controller.page_cache_directory + yql_feed_path(person)
    FileUtils.mkdir_p(File.dirname(path))
    File.open(path, 'w') do |f|
      f.write(render_to_string :action => 'feed')
    end
  end
  render :text => "re-caching was successful"
end

简单地渲染Feed并将其写入正确位置的文件。围绕缓存系统我并不高兴,但现在就足够了。

答案 1 :(得分:0)

要缓存它,你必须渲染它,并渲染它,你必须要求它。如果没有请求,我认为你不能这样做。你总是可以从Rails创建一个,但这看起来很混乱,或者你可以有一个外部进程,用curl或Ruby curb库来完成它。

您确定必须这样做吗?

答案 2 :(得分:0)

更好的解决方案是使页面过期,然后使用curl命中它。因为curl会生成一个新请求,所以Passenger只需要足够的内存来呈现一个feed。它还避免绕过缓存系统。

def recache
  Person.find_each :batch_size => 100 do |person|
    expire_page( :controller => 'yql', :action => 'feed', :id => person.id )
    system("curl #{yql_feed_url person.id}")
  end
  render :text => "re-caching was successful"
end

当然,这是一个仅限Linux的解决方案。注意竞争条件也很重要。