2013-05-07 42 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