我有一个页面,我想在memcache中缓存。我在Heroku上,所以标准页面缓存不是一种选择。
我希望有中间件来检查是否设置了特定的cookie值。如果它不存在,我想只在缓存中呈现值。否则,我希望Rails像普通一样处理它,然后在控制器中稍后选择服务器缓存中的值(在检查cookie中的值时)。
基本上,我需要一种方法来缓存memcache中的页面并在以后提供它。我不想只使用静态文件,因此页面可以利用布局,资产管道等。所以我猜主要问题是如何将页面呈现为内存缓存。 < / p>
非常感谢任何帮助。
答案 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_when
,stale?
和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,但我相信现在有一个替代方案)。如果您不需要大缓存,则入门包是免费的。