3

假设我在 Heroku 上有一个带有许多帖子的 Rails 4.2 站点。查看帖子时,应用程序会访问数据库以从其他模型中获取帖子的数据和相关数据。我网站的访问者(未登录用户)应该会看到没有任何自定义的帖子,因此显示这些页面不需要访问数据库。如何为我网站的所有访问者设置简单的页面或操作缓存(或等效项) ,从而跳过数据库?我也可以让 CDN 接管渲染这些页面吗?

4

3 回答 3

4

对于初学者,请查看Rails 缓存指南。页面和动作缓存都已从 Rails 中删除。

您可以尝试片段缓存,它会抓取帖子的生成 HTML 并将其存储起来,但您需要一个基于是否存在current_user.

一个超级简单的版本可能如下所示:

app/views/posts/show.html.erb

<% cache_unless (current_user, @post) do %>
  <%= @post.body %>
<% end %>

如果该帖子存在缓存,则该cache方法将是一个读取操作,如果该缓存不存在,它将是一个生成和写入操作。

使用 ActiveRecord 对象进行缓存会创建一个默认包含的键updated_at,因此如果帖子发生更改,加载该帖子的第一个访问者将有更长的等待时间,并且每个后续访问者都将获得缓存的好处。

至于您的另一个问题,还有许多其他基于 Ruby 的工具可用于提供静态页面,并且对所有这些工具的审查超出了我的知识范围,并且可能超出了这个问题的范围。:)

于 2015-10-27T04:55:04.167 回答
1

Lanny Bose 的回答确实看起来最好,但我会添加此链接:

https://devcenter.heroku.com/articles/http-caching-ruby-rails#public-requests

整个页面很有用,但特别是它谈到了将请求标记为公共或私有。默认情况下它们是私有的,但如果您将其标记为公共,它允许页面由中间代理缓存提供服务。

链接页面谈到 Rack::Cache + memcache 作为代理缓存;我不确定这是否仍然存在于 Rails 4 中。

第二个heroku页面讨论了动作缓存,它可以为你缓存一个特定的动作:

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

于 2015-10-28T03:01:29.620 回答
0

你真的不想在这里缓存。您只需要控制器和视图中的条件,例如

# controller
if logged_in?
  @post = Post.find(params[:id])
  # load more records
end

# view
<% if @post %>
  <%= @post.title %>
  ...
<% else %>
  You're not logged in, blah blah.
<% end %>

.. 假设控制器不仅仅是加载发布记录。我不一定同意有条件地加载上述记录,但您的用例可能需要它。

或者,如果您出于性能原因需要缓存,您可以优雅地将当前用户 ID 包含在片段缓存键中,例如

<% cache "post-#{@post.id}-#{current_user ? current_user.id : 0}" do %>
  <% if logged_in? %>
  ... # expensive operations
  <% else %>
    Please login to see more..
  <% end %>
<% end %>

以便缓存对用户或匿名用户使用相同的代码。

于 2015-10-27T19:11:54.283 回答