Ruby on rails Rails:缓存还是不缓存
我正在尝试使用缓存,但我想知道是否有可能缓存频繁更改的数据 如果数据经常更改,缓存是否是一个好策略 如果我使用片段缓存缓存帖子列表,并且用户编辑了他的帖子,缓存是否会自动上传?缓存如何处理个性化数据?(例如,包含当前用户数据eccc的页面) 在这种情况下,@posts更新时缓存是否自动上载Ruby on rails Rails:缓存还是不缓存,ruby-on-rails,ruby,performance,caching,Ruby On Rails,Ruby,Performance,Caching,我正在尝试使用缓存,但我想知道是否有可能缓存频繁更改的数据 如果数据经常更改,缓存是否是一个好策略 如果我使用片段缓存缓存帖子列表,并且用户编辑了他的帖子,缓存是否会自动上传?缓存如何处理个性化数据?(例如,包含当前用户数据eccc的页面) 在这种情况下,@posts更新时缓存是否自动上载 <% @posts.each do |post| %> <% cache post do %> <%= render partial: 'shared/post_li
<% @posts.each do |post| %>
<% cache post do %>
<%= render partial: 'shared/post_list', locals: {post: post} %>
<% end %>
<% end %>
谢谢简短回答:缓存密钥无效时,缓存将更新。在您的情况下,当特定帖子的
updated_at
字段晚于缓存中的内容时,缓存将被更新。请务必注意,缓存更新是在首次呈现视图中的新数据时发生的,而不是在数据库中更新数据时发生的
详细回答:我强烈建议你阅读基础知识
问题中发布的代码块使用。cache product
调用将生成一个缓存键,该缓存键由post.id
、post.updated\u at
和视图模板的MD5散列组成。Rails将在缓存中搜索该键,如果找到,将返回缓存值,而不必渲染部分。这是缓存命中。如果找不到缓存键,Rails将渲染部分缓存并将结果存储在缓存中以备将来使用。这是缓存未命中
任何缓存方案的棘手部分都是缓存验证,即确保缓存提供的数据有效且准确。例如,如果数据库中的数据已更改,我们希望为数据库数据提供服务,而不是陈旧(旧)缓存数据
Rails通过构建上述缓存密钥“自动”解决了这个问题。如果post
记录中的数据发生更改,则将更新post.updated\u at
并使用新的缓存键,这将导致缓存未命中。当缓存中的数据是旧数据时,您希望发生这种情况。同样,如果视图模板更改,则视图的MD5哈希将更改,缓存密钥也将更新,从而导致缓存未命中
如果shared/post_列表
部分引用了post
记录中未捕获的数据或变量,则可能会出现问题。例如,如果部分更改取决于用户是否为管理员,则您将希望在缓存密钥中捕获用户的管理员状态。您可以这样做:
<% cache [post, current_user.admin?] do %>
上述代码将在其注释发生任何更改时更新post
记录的updated\u
最后,Rails提供了一种称为的方法,这是一种更有效的呈现部分/模板集合的方法。在您的示例中,您可以通过将整个循环替换为一行代码来实现这种形式的缓存:
<%= render partial: 'shared/post_list', collection: @posts, cached: true %>
缓存比这里描述的要多得多。我建议您阅读本文中链接的指南,以便全面了解缓存验证。通过缓存,您可以显著提高服务器的速度。在某些情况下,我看到服务器响应时间下降了一个数量级。然而,除非您小心,否则最终可能会在缓存中提供过期日期
<%= render partial: 'shared/post_list', collection: @posts, cached: true %>