2

我有一个想要缓存在内存缓存中的页面。我在 Heroku,所以标准页面缓存不是一个选项。

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

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

任何帮助将不胜感激。

4

4 回答 4

3

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

fresh_when @product, public: true

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

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

我将在此 RailsCasts 剧集中详细介绍(需要付费订阅)

于 2012-06-29T20:16:45.050 回答
3

我已经看到使用带有 Proc 的 caches_action 的出色性能。尝试这个:

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

如果用户未登录,这应该从 memcache 提供页面。因为它正在缓存操作,所以 application_controller 中的任何内容都将首先运行(方便,尽管速度较慢)。使用这种策略,我已经看到在 10 毫秒以下的范围内页面加载超出了内存缓存。这应该可以很好地工作而无需跳入中间件。

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

于 2012-06-29T17:20:44.733 回答
1
Rails.cache 'somekey' do
   do_whatever
end

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

于 2012-06-29T17:02:03.967 回答
1

页面缓存确实适用于 Heroku,但需要一些配置。如果你在竹栈上,你的应用前面已经有了 Varnish。如果您在 Cedar 上,则不需要,但仍有缓存选项供您使用。我建议看看:

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

那里概述了几种策略,例如页面缓存、动作缓存、片段缓存等。

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

于 2012-06-29T17:25:08.070 回答