Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:缓存还是不缓存_Ruby On Rails_Ruby_Performance_Caching - Fatal编程技术网

Ruby on rails Rails:缓存还是不缓存

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

我正在尝试使用缓存,但我想知道是否有可能缓存频繁更改的数据

如果数据经常更改,缓存是否是一个好策略

如果我使用片段缓存缓存帖子列表,并且用户编辑了他的帖子,缓存是否会自动上传?缓存如何处理个性化数据?(例如,包含当前用户数据eccc的页面)

在这种情况下,@posts更新时缓存是否自动上载

<% @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 %>