页面缓存,自动过期/清扫器的最佳实践

时间:2009-12-14 16:56:54

标签: ruby-on-rails caching

到目前为止,我从未真正深入研究过Rails提供的惊人的缓存技术。我无法解决的一件事是如何解决这个特殊问题。

鉴于我有一个包含许多帖子的博客模型:

class Blog < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  named_scope :published, :conditions => ["published_at < ?", Time.now]
end

BlogsController中的show动作显示已发布的帖子列表:

// BlogsController

def show
 @blog = Blog.find(params[:id)
end

// View

<% @blog.posts.published.each do |p| %>
 <h2><%=h p.title %></h2>
 <%= simple_format(p.content) %>
<% end %>

当对published_at属性进行任何更改时,缓存必须到期。但是当将来放置published_at并且达到该时间时,它还需要执行此操作。

你能告诉我一些如何最好地解决这个问题的想法和指示吗? Cron-job还是我在忘记?

2 个答案:

答案 0 :(得分:5)

您显示的代码不使用任何Rails的缓存功能。但是,当首次执行该代码时,您的:published命名范围将使用(并且在生产中,通过类缓存记住)Time.now

我怀疑你想要这个:

named_scope :published, lambda { { :conditions => ["published_at < ?", Time.now] } }

lambda确保Rails每次都重新评估你的状况。

答案 1 :(得分:1)

这完全取决于您用于存储缓存的数据存储类型。

如果您正在使用文件系统,则可以编写一个cron作业以使缓存在特定时间间隔内无效,或者在缓存密钥中编码缓存有效的日期时间,并在每个请求上检查并在必要时使其无效。 / p>

或者,如果你是memcached后端,你可以使用可预期的缓存,这可能是最好的解决方案。