Rails3和轻松缓存视图和控制器

时间:2010-09-10 13:49:11

标签: caching ruby-on-rails-3 memcached

我目前正在缓存我的网络应用程序。

所以我开车使用memcache,我正在寻找一种简单的方法来处理所有这些。

例如,我想缓存我的所有内容,直到它们没有被修改。

我无法缓存所有页面,因为某些部分需要缓存。

所以我可以将一个fragment_cache用于控制器,然后另一个用于视图,然后在更新后的模型中删除该片段。

但感觉很重,我不喜欢这样。

如果您有任何想法,我会很高兴听到它们。

谢谢;)

2 个答案:

答案 0 :(得分:4)

你看过扫地机吗?我在我的一些应用程序中大量使用它们并且它们运行良好并且将缓存与模型分开。您可以创建一个观察更改的清扫程序,而不是清除模型中的缓存。您可以根据保存,更新等指定何时清除缓存。使您无需直接在模型中编写该内容。只需为app / sweepers创建一个目录,并为要清除缓存的每个模型插入一个目录。此特定示例适用于操作缓存,但您可以应用类似于片段的内容。

  class WidgetSweeper < ActionController::Caching::Sweeper
      observe Widget
      def after_update(widget)
        expire_cache_for(widget)
      end

      def after_destroy(widget)
        expire_cache_for(widget)
      end

      def after_create(widget)
        expire_cache_for(widget)
      end

  private
    def expire_cache_for(widget)
      expire_action(:controller=>"widgets",:action=>"show",:id=>widget.id)
      expire_action(:controller=>"widgets",:action=>"index")
    end
  end

我在这里做了关于动作和片段缓存的写作,其中包含了更多细节,包括如何根据条件进行缓存:
http://www.cowboycoded.com/2010/07/14/performance-exercise-1-rails-cache-cash/

答案 1 :(得分:0)

您还可以使用缓存名称来扫描数据。

例如,如果你这样做:

<% cache "my_model_#{@model.updated_at}" do %>
stuff I render with my model
<% end %>

当模型更新时,您会自动清除缓存,并且不再使用清扫器。