2013-05-07 45 views
1

假設你想要做的Rails的一些低級別的緩存(與memcached的,例如)和你想在你的應用程序,比如某個地方只有1電話...Rails 3:放置Rails.cache.fetch「緩存加熱器」調用的位置?

Rails.cache.fetch('books', expires_in: 1.day) do 
    Book.offset(offset) 
     .limit(limit) 
     .select('title, author, number_of_pages') 
     .all 
end 

...熱身緩存當您啓動您的應用程序,讓您可以只使用一個簡單的調用,比如......

Rails.cache.read('books') 

... 隨時隨地並多次在您的應用程序(在視圖,控制器,助手。 ..)訪問這個「書籍」集合。

一個應該在哪裏把最初的「魂」呼,使其工作?

+0

爲什麼在應用程序啓動時這樣做?如果您的緩存在1.day中過期,您是不是希望每天運行一次?我會把它包裝在一個rake任務中,並用'cron'運行它。 – spike 2013-05-07 17:30:27

+0

@spike - 假設:expires_in的值也可能更長。 (我認爲在應用程序啓動時這樣做是因爲我會在其他地方使用較短的「Rails.cache.read」。) – TomDogg 2013-05-07 17:34:04

回答

2

在您的評論後,我想清除一些事情。

你應該總是使用fetch,如果你需要的結果回來。裹在一個類的方法裏面調用Book爲方便:

class Book 
    def self.cached_books 
    Rails.cache.fetch <...> 
    end 
end 

你可以有一個不同的方法迫使緩存重新創建:

def self.write_book_cache 
    Rails.cache.write <...> 
    end 
end 

然後在你的初始化,或耙子任務,你可以這樣做:

Book.write_book_cache 

這似乎更容易維護我,同時保持到緩存簡潔呼叫你的代碼的其餘部分。

+0

是否必須始終使用「獲取」?我的意思是,即使您知道您已經以某種方式填充了緩存,就像在應用程序啓動時一樣? – TomDogg 2013-05-07 17:47:23

+0

如果memcached空間不足,它將丟棄較舊的密鑰。你不應該認爲你的緩存*當然存在,只是因爲你在那裏放置了某些東西。 – spike 2013-05-07 17:48:32

+0

非常酷,現在一切都很清晰 - 謝謝你! – TomDogg 2013-05-07 18:00:50

1

我首先想到的是把它放在一個初始化 - 可能是一個專門爲目的(/config/initializers/init_cache.rb,或類似的東西)。

應當自動執行(由於在初始化文件夾是)時,應用程序啓動。

+0

此解決方案的問題在於必須先加載模型,然後才能填充緩存。 – TomDogg 2013-05-07 17:40:04