2010-09-10 53 views
1

我目前正在緩存我的Web應用程序。Rails3和輕鬆緩存視圖和控制器

所以我開車使用memcache,我正在尋找一個簡單的方法來處理所有這一切。

例如,我想緩存我的所有內容,直到它們未被修改。

我無法緩存所有頁面,因爲有些部分需要緩存。

所以我可以使用控制器的fragment_cache,然後將其他視圖放入視圖中,然後在更新後的模型中刪除片段。

但感覺很重,我不喜歡這種方式。

如果您有任何想法,我會很高興聽到他們。

謝謝;)

回答

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/

+0

感謝您的回答。我不知道清掃工。這正是我所期待的。回答驗證;) – Arkan 2010-09-10 14:39:31

0

你也可以使用緩存名稱來掃你的數據。

例如,如果你這樣做:

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

自動爲您當模型更新你的緩存清理,和你擺脫使用掃墓的。

+0

您不必這樣做,因爲這是爲您自動完成的。所以無論何時你'model.touch'緩存的片段都會失效。 – fphilipe 2011-04-07 15:52:29