Rails 5 memcached 缓存问题,即使我清除了缓存,错误的片段缓存仍然存在

Rails 5 with memcached caching issue, wrong fragment cache is sticking even if I clear the cache

我在 Heroku 上托管了一个 Rails 5.2 应用程序,使用了 Memcached 云,我在该应用程序中实施了多种缓存技术,但其中一部分存在很大问题,我试图在过去修复它几天:

一个视图中的片段缓存有一个设计问题,我已经修复了,然后这个设计错误仍然被缓存并交付给用户即使在使用以下方法多次清除缓存后:

Rails.cache.clear 这给了我像这样清除缓存的正确输出:

irb(main):001:0> Rails.cache.clear
D, [2019-08-20T08:42:09.459517 #4] DEBUG -- : Dalli::Server#connect memcached-xxxxxxxxxx
I, [2019-08-20T08:42:09.596603 #4]  INFO -- : Dalli/SASL authenticating as memcached-appxxxxxx
I, [2019-08-20T08:42:09.598383 #4]  INFO -- : Dalli/SASL: Authenticated
=> [true]

一旦我清除缓存(从 Rails)然后重新加载此页面,页面的设计错误就已修复,但是对于其他页面,错误的缓存仍然存在,直到我找到该(错误缓存的)页面,加载它然后它不会被修复,直到我再次清除缓存 ...

现在我必须找到每一个错误缓存的页面,加载一次(使用错误的缓存)然后清除缓存以使其正常工作(好像我正在一个一个清缓存)

一次性修复所有缓存页面的正确方法是什么?

我建议不要让片段缓存过期,而是对其进行版本控制。例如您可以使用 nav_header_v2 之类的键,而不是 nav_header。 Memcached 会自动清除未使用的内容,因此原始片段会消失,为新片段腾出空间。您永远不必担心清除缓存。

您可以更进一步,在所有片段键上自动包含一个 git 版本 ID,这样它们会在代码更改时刷新,例如nav_header_#{My::Application.config.git_commit}|.

这是方法 RailsGuides explains,ActiveRecord 通过 cache_key_with_version 支持它,因此您可以轻松地对模型的视图进行片段缓存,而无需在数据更改时清除它们。