更新寄存器时如何更新片段缓存?

时间:2019-02-08 20:16:32

标签: ruby-on-rails actionview ruby-on-rails-5.2

我最近将项目从Rails 4更新到了Rails 5.2。经过测试,我发现缓存没有在应有的位置被更新。

在阅读文档时,我注意到ActionView进行缓存的方式有所不同。

Rails 4在高速缓存名称上包含updated_at值。这样,每次触摸该元素时,以前的缓存就会过时,并创建一个新的缓存。

views/projects/123-20120806214154/7a1156131a6928cb0026877f8b749ac9
      ^class   ^id ^updated_at    ^template tree digest

太好了。但是Rails 5.2进行了一些更改,其中不再在缓存名称中设置了updated_at值。从文档中:

views/template/action.html.erb:7a1156131a6928cb0026877f8b749ac9/projects/123
      ^template path           ^template tree digest            ^class   ^id

文档仍然指出:

  

触摸项目updated_at时,即使键保持稳定,cache_version也将更改。这意味着,与传统的基于键的缓存过期方法不同,您不会因为仅更新了相关记录而生成缓存垃圾,未使用的键。

据此,我想它在幕后做了一些魔术来替换缓存中的值,但事实并非如此。

我的代码:

<% cache ['tags', post] do %>
  <%= render "shared/tags", post: post %>
<% end %>

即使我在控制台上post.touch cache "tags/#{post.updated_at}" do ... ,缓存仍然保持旧的状态,我必须手动删除缓存才能正常工作。我想念什么吗?我如何使其重新工作?

我知道我可以做类似的事情

ResetOnRespawn

但是从文档来看,感觉不对。

1 个答案:

答案 0 :(得分:0)

我知道了。我的项目使用Redis来存储缓存,并且升级后我没有从我的Gemfile中删除gem redis-rails。从redis-activesupport gem写入缓存的方法是覆盖为redis内置的rails,该方法是从Rails 5.2开始引入的。

因此解决方法只是删除redis-rails宝石。