如何使用memcache在控制器中缓存查找?

时间:2009-11-23 17:01:01

标签: ruby-on-rails caching memcached

我在控制器中有这个方法:

def article_info
  if @article = Article.find_by_permalink(params[:permalink])
    @title = @article.title
    @description = @article.excerpt
    @body = @article.body
  else
    render_404
  end
end

我最终想要缓存Article.find_by_permalink的结果,以便每次访问文章时都不会执行查询。

那么,我该如何缓存该查询呢?我可以从控制器中缓存吗?

澄清:我希望无限期地缓存它(直到我决定使它过期)。我最终会使用memcache来做到这一点。

4 个答案:

答案 0 :(得分:0)

你查过日志了吗?通常rails本身就可以很好地缓存事物。

缓存数据库调用如下所示:

**CACHE (0.0ms)**   SELECT * FROM `funnels` WHERE bla bla

如果不满足您,请尝试查看this tutorial on rails envy

当然,如果你这样做......

@article = Article.find_by_permalink(params[:permalink])
@title = @article.title
@description = @article.excerpt
@body = @article.body

...只进行了1次数据库查询。调用@article不会重新加载对象。

答案 1 :(得分:0)

答案 2 :(得分:0)

您不会在控制器中缓存模型对象,而是将它们缓存在模型中。

答案 3 :(得分:0)

您可以按照here描述的模型在模型中定义新方法:

# models/article.rb
def self.all_cached
  Rails.cache.fetch('Article.all') { all }
end

然后,如果结果被缓存,则对Article.all_cached的调用将不会查询数据库。否则它会从数据库中获取结果。

更新:您的find_by_permalink来电可以替换为cached_find_by_permalink

# models/article.rb
def self.cached_find_by_permalink(permalink)
  Rails.cache.fetch('Article.find_by_permalink.' + permalink) do
    find_by_permalink(permalink)
  end
end