在memcache中缓存整个页面,从中间件或控制器缓存可选服务

时间:2012-06-29 16:59:10

标签: ruby-on-rails ruby controller memcached middleware

我有一个页面,我想在memcache中缓存。我在Heroku上,所以标准页面缓存不是一种选择。

我希望有中间件来检查是否设置了特定的cookie值。如果它不存在,我想只在缓存中呈现值。否则,我希望Rails像普通一样处理它,然后在控制器中稍后选择服务器缓存中的值(在检查cookie中的值时)。

基本上,我需要一种方法来缓存memcache中的页面并在以后提供它。我不想只使用静态文件,因此页面可以利用布局,资产管道等。所以我猜主要问题是如何将页面呈现为内存缓存。 < / p>

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:3)

我已经看到使用带有Proc的caches_action的出色表现。试试这个:

caches_action :index, :unless => { |c| c.user_logged_in? }

如果用户没有登录,这应该从memcache提供页面。因为它正在缓存操作,所以application_controller中的任何内容都将首先运行(方便,但速度较慢)。通过这种策略,我看到了低于10ms范围内的memcache页面加载。这应该很好,而不需要跳入中间件。

如果这还不够,你可能想看看Rack :: Cache

答案 1 :(得分:3)

Rack::Cache将执行您需要的操作,并在生产中自动启用。它使用HTTP headers来确定缓存行为。您可以在控制器操作中使用fresh_whenstale?expires_in调用设置这些标头。但是,为Rack :: Cache设置public: true选项以获取它是很重要的。

fresh_when @product, public: true

默认情况下,缓存存储在Rails.cache中,因此需要配置为使用memcached。

这种方法的一个好的副作用是,由于它使用HTTP缓存,缓存可以存储在客户端的浏览器或本地网络代理上。这将使您的网站对用户感觉更快,因为缓存更接近。

我进一步详细介绍in this RailsCasts episode (paid subscription required)

答案 2 :(得分:1)

Rails.cache 'somekey' do
   do_whatever
end

这将尝试获取密钥,如果它存在,它将呈现。如果不是,它将处理块并将键设置为值

答案 3 :(得分:1)

页面缓存可以在Heroku上运行,但需要一些配置。如果你在竹堆上,你的应用程序前已经有了Varnish。如果您使用Cedar,则不会,但仍有缓存选项。我建议看看:

https://devcenter.heroku.com/articles/caching-strategies

其中列出了几种策略,如页面缓存,动作缓存,片段缓存等。

你确实需要一个缓存插件(我使用memcache,但我相信现在有一个替代方案)。如果您不需要大缓存,则入门包是免费的。