【问题标题】:Good way to invalidate cache entries when view code changes?查看代码更改时使缓存条目无效的好方法?
【发布时间】:2019-07-04 10:43:12
【问题描述】:

我正在使用 Rails 3.2 并寻找一种可靠的方法,以在更改一段视图代码时使缓存条目无效。在这个article 中,我看到 37signals 在缓存键前面加上一个版本字符串,每次视图代码更改时都会更改。

例如,如果我将 All my... 更改为 My...

<%= cache ["v1", project] do %>
  <p>All my todo lists:</p>
  [...]
<% end %>

我会通过将v1 更改为v2 来确保缓存条目无效

<%= cache ["v2", project] do %>
  <p>My todo lists:</p>
  [...]
<% end %>

有没有更可靠的方法来实现这一点?我担心在更改从缓存块内部调用的部分或帮助代码时,我们会忘记更新那些 vX 字符串前缀。

【问题讨论】:

    标签: ruby-on-rails caching


    【解决方案1】:

    您可以使用cache_digest。它完全符合您的需要:在视图更改时自动使缓存片段无效。这样您就无需手动跟踪每个视图版本。

    【讨论】:

      【解决方案2】:

      您实际上不需要手动执行此操作。我不确定是哪个版本的 Rails 引入了这个,但是当您使用 cache 视图助手时,它包含您正在呈现的视图的摘要,因此如果视图发生更改,它将使缓存无效。您可以查看Rails docs on fragment caching 了解更多信息。

      【讨论】:

        【解决方案3】:
        <%= cahe ['todo', project] do %>
        .
        .
        

        在控制器中,更新后

        def update
        .
        .
        if @project.update_attributes(params[:project)
          expire_fragment ['todo', @project] 
          render 'something'
        

        在我的系统中,我可以在日志中看到
        在报告显示上写入片段视图/show/reports/46-20121016112032 (3.0ms)
        下一个回复
        读取片段视图/show/reports/46-20121016112032 (0.2ms)
        报告结束#update
        过期片段视图/show/reports/46-20121016064919 (1.2ms)

        【讨论】:

        • 项目更改时缓存过期,但在我的情况下,我不仅希望在项目更改时使缓存过期,而且在缓存块内的代码更改且不一定项目
        • 在部署场景中更新代码后,您可以使所有片段过期
        • 感谢 antiqe 可以工作,但是我们每天部署几次,我们的片段会过于频繁地过期;或者我们可以仅在某些视图或帮助文件发生更改时在部署中使它们过期
        猜你喜欢
        • 1970-01-01
        • 2014-07-27
        • 2016-08-31
        • 1970-01-01
        • 2011-05-26
        • 2014-04-04
        • 1970-01-01
        • 2014-06-12
        • 2023-03-18
        相关资源
        最近更新 更多