如何清除 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 不起作用)的主要内容,如果未能解决你的问题,请参考以下文章