如何清除 Rails 动作缓存? (Rails.cache.clear 不起作用)

Posted

技术标签:

【中文标题】如何清除 Rails 动作缓存? (Rails.cache.clear 不起作用)【英文标题】:How can I clear rails action cache? (Rails.cache.clear isn't working) 【发布时间】:2019-05-27 06:27:08 【问题描述】:

如何在不重启服务器的情况下清除 Rails 动作缓存?

我有一个用新数据更新 Postgres 数据库的脚本。我想在脚本完成后清除所有缓存的页面。但如果不完全重新启动 Heroku 服务器,我似乎无法使其生效

我试过没有成功:

Rails.cache.clear => ["/app/tmp/cache/bootsnap-compile-cache", "/app/tmp/cache/bootsnap-load-path-cache"] rails tmp:cache:clear rails assets:clean

config.cache_store 没有为生产明确设置,(我看到了关于默认使用什么缓存的混合信息)

我已确保浏览器中没有缓存(通过在开发工具中禁用缓存并绕过服务工作者)

我将 Heroku 与 ruby​​ 2.5.3、rails 5.2.1.1 和 actionpack-action_caching 1.2.0 一起使用

我怎么知道它没有被缓存在数据库层或片段缓存中?

我将日志记录添加到仅记录重新启动后第一次访问页面时的操作

更新:我删除了动作缓存,而是通过使用预先加载更好地优化了 SQL 采石场。

更新2(回想起来)

我没有正确理解 Heroku 的测功机的工作原理。

Heroku 在使用 heroku run bash 时会启动新的虚拟机(dynos),导致任何缓存清除都不会影响在现有 dyno 上运行的网络服务器。要通过 ssh 进入运行的 dynos,您需要使用 heroku ps:exec

【问题讨论】:

我想知道这是不是XY problem。您能否详细解释一下您是如何确定需要清除缓存的? 我有一个 400 行的更新脚本(包含 20 多个方法),它破坏了 5 个数据库表并将新数据导入这些表中。添加动作缓存后,发现脚本要等服务器重启后才会生效。 @AryeEidelman 有 3 种可能性;第一个是,您正在使用内存缓存。在这种情况下,即使您调用Rails.cache.clear,它也不应该清除缓存,因为您的脚本和 Rails 应用程序在不同的进程中运行,并且每个进程都有自己的堆。第二个是,您将文件存储用作缓存存储。在这种情况下,您应该确保您的脚本与 Rails 应用程序在同一台机器上,否则它只会删除本地缓存文件。第三个是,您为 Rails 应用程序和清理脚本使用不同的缓存存储。 @foo-bar-zoo 感谢您的洞察力。正如 hazhir-derakhshi 和其他人告诉我的那样,这应该使用内存缓存。因此,我将在管理仪表板中添加一个清除缓存按钮,它将在与服务器相同的进程上运行 Rails.cache.clear。看看这是否有效。 或者我可以通过 ssh 进入测功机并以这种方式清除缓存。 devcenter.heroku.com/articles/exec 【参考方案1】:

如您所见here,生产中的默认缓存存储是 mem_cache_store。因此,您应该能够以不同的方式清除它,而无需重新启动服务器。 Maciej Mensfeld 就这些方式写了一封blog。如果Rails.cache.clear不起作用,我个人在缓存服务器中使用flush_all命令。

【讨论】:

以上是关于如何清除 Rails 动作缓存? (Rails.cache.clear 不起作用)的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 6 中更新底层模型时如何使动作缓存过期?

带有查询字符串参数的 Rails 动作缓存

Rails的不同缓存策略

从 Rails 资产管道中清除缓存

Rails 验证后如何清除表单

关于新浪微博缓存的功能是怎么实现的