gpt4 book ai didi

ruby-on-rails - rails : Cache or not Cache

转载 作者:数据小太阳 更新时间:2023-10-29 08:35:33 25 4
gpt4 key购买 nike

我正在尝试使用缓存,但我想知道是否可以缓存经常更改的数据。

如果数据经常变化,缓存是一个好的策略吗?

如果我用片段缓存缓存一个帖子列表,并且用户编辑他的帖子,缓存会自动上传吗?缓存如何处理个性化数据? (例如带有 current_user.data eccc 的页面)

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

<% @posts.each do |post| %>
<% cache post do %>
<%= render partial: 'shared/post_list', locals: {post: post} %>
<% end %>
<% end %>

谢谢

最佳答案

简答:当缓存键无效时,缓存将更新。在您的情况下,当特定帖子的 updated_at 字段晚于缓存中的内容时,缓存将被更新。重要的是要注意,缓存更新发生在 View 中的新数据首次呈现时,而不是数据库中的数据更新时。

长答案:我强烈建议您阅读 Caching with Rails为基础。

问题中发布的代码块使用 Rails' Fragment Caching . cache product 调用将生成一个缓存键,它是 post.idpost.updated_at 和 View 模板的 MD5 哈希的组合. Rails 将在缓存中搜索该键,如果找到,将返回缓存值而无需渲染部分。这是缓存命中。如果找不到缓存键,那么 Rails 将渲染部分并将结果存储在缓存中以备将来使用。这是缓存未命中。

任何缓存方案的棘手部分是缓存验证,即确保缓存提供的数据有效且准确。例如,如果数据库中的数据已更改,我们希望提供数据库数据而不是陈旧(旧)缓存数据。

Rails 通过构建上述缓存键“自动”解决了这个问题。如果 post 记录中的数据发生变化,则 post.updated_at 将被更新并使用新的缓存键,这将导致缓存未命中。当缓存中的数据陈旧时,这就是您希望发生的情况。同样,如果 View 模板发生变化,则 View 的 MD5 哈希将发生变化,缓存键也将更新,从而导致缓存未命中。

如果 shared/post_list 部分引用未在 post 记录中捕获的数据或变量,这可能会成为问题。例如,如果部分更改取决于用户是否是管理员,那么您将希望在缓存键中捕获用户的管理员状态。你会做这样的事情:

<% cache [post, current_user.admin?] do %>

另一个常见的例子是部分引用了与帖子相关的其他数据库对象。为了争论起见,假设您的部分渲染了 post.comments 列表。如果评论更改,但该更改未触及 post 记录的 updated_at 字段,则缓存提供的数据将无效。这个问题通过在 belongs_to 关联中添加 touch: true 来解决:

Class Comment < ActiveRecord:base
belongs_to :post, touch: true
...
end

上面的代码将更新 post 记录的 updated_at 每当它的评论之一发生变化时。

最后,Rails 提供了一个叫做 Collection Caching 的东西。这是呈现部分/模板集合的更有效方式。您可以通过用一行代码替换整个 each 循环来在您的示例中实现这种形式的缓存:

<%= render partial: 'shared/post_list', collection: @posts, cached: true %>

缓存比这里描述的要多得多。我建议您阅读这篇文章中链接的指南,以便您对缓存验证有一个透彻的了解。您可以通过缓存显着加快服务器速度。在某些情况下,我看到服务器响应时间下降了一个数量级。但是,除非您小心,否则您最终可能会在缓存中提供过时的日期。

关于ruby-on-rails - rails : Cache or not Cache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47123360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com