【问题标题】:Sidekiq Workers Not Expiring CacheSidekiq Worker 缓存未过期
【发布时间】:2021-06-26 20:22:09
【问题描述】:

我们的架构具有仅运行 Sidekiq 工作进程的专用服务器,即没有应用服务器。我们正在进行一些模型缓存 - 模型内对 Rails.cache 的所有调用都指定了一个 expires_in 值,但没有清除过期的缓存。

有时磁盘 inode 会填满,因为 tmp/cache 永远不会被清理。

修复很简单 - 为 tmp:cache:clear 运行一个 cron 作业,但也许社区可以提供一些关于 Rails 如何清除过期模型缓存键的指导和理解,特别是当 Sidekiq 工作人员是唯一运行的东西时在服务器上。

【问题讨论】:

  • 那么,缓存在磁盘上吗?不是redis?
  • 没错——我们正在使用磁盘缓存。

标签: ruby-on-rails caching sidekiq


【解决方案1】:

过期由缓存存储处理,如果它支持这样的事情。 Rails 的默认缓存存储(文件存储)很简单,它知道的不多。您正在做什么,手动清除缓存是文档(如下)所建议的。

你可以试试RedisMemcached,他们知道怎么让东西过期。

摘自ActiveSupport::Cache::FileStore

2.4 ActiveSupport::Cache::FileStore

此缓存存储使用文件系统来存储条目。初始化缓存时必须指定存储文件存储目录的路径。

由于缓存会增长直到磁盘已满,建议定期清除旧条目。

如果没有提供明确的 config.cache_store,这是默认的缓存存储实现(位于“#{root}/tmp/cache/”)。

另一个来自ActiveSupport::Cache::Store

:expires_in - 此选项设置缓存条目的过期时间(以秒为单位),如果缓存存储支持它,它将自动从缓存中删除。

【讨论】:

  • 在我们的代码中,所有对 Rails.cache 方法的调用都为 :expires_in 设置了一个值,因此所有的缓存键都应该有一个过期设置。当服务器不运行 Rails 应用程序(它只运行 Sidekiq 工作程序)时,Rails 似乎永远不会自动从缓存中删除过期项目。
  • 设置过期没关系,只要文件存储不知道怎么处理。在答案中有来自文档的摘录。
  • 请更新这些模型以及 sidekiq 如何运行作业。
猜你喜欢
  • 2012-08-17
  • 2017-09-09
  • 2016-09-08
  • 2018-03-04
  • 2018-08-23
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
相关资源
最近更新 更多