【问题标题】:Trying to Rails.cache.delete_matched from the runner尝试从跑步者中获取 Rails.cache.delete_matched
【发布时间】:2012-01-26 18:48:23
【问题描述】:

在 redmine 1.2/rails 2.3.11 上,我将存储库降价文件呈现为 html(就像 redmine_markdown_extra_viewer 所做的那样),现在我正在尝试缓存结果,该结果应该在每次提交时更新。

所以我有一个获取 repo 更改的 git 钩子,我希望它也可以清除相应的缓存条目。

缓存生成(在 RepositoriesController::entry 覆盖中):

cache_key =['repositories_md', @project.id.to_s, @path.to_s].join('/')
puts cache_key
@content = cache_store.fetch cache_key do
   Kramdown::Document.new(@repository.cat(@path, @rev)).to_html
end
render :action => "entry_markdown"

应该清除缓存但没有效果的钩子:

# This is ok
ruby script/runner "Repository.fetch_changesets"

# This not
ruby script/runner "Rails.cache.delete_matched(/repositories_md\/.*/)"

所以它不起作用,我什至不知道我是否采取了正确的方向来实现它。非常感谢任何输入!

【问题讨论】:

    标签: ruby-on-rails caching runner


    【解决方案1】:

    您使用的是哪个缓存后端?

    如果它是 memcached 或 FileStoreMemoryStore 以外的任何东西,则不支持 delete_matched 方法

    您最好让它们过期并在它们更新时替换它们的缓存内容。

    【讨论】:

    • 我没想到,我还不知道怎么弄出来,但我猜是你说的。感谢您指出了这一点。也许我不应该关心缓存,redmine 会在生产环境中执行它并更新它以更改存储库。无论如何,我需要学习很多......
    • 是的,这是正常的方法。理想情况下,我们不关心缓存。我们设置值,带有一个可选的过期时间,当需要刷新值时,我们只是替换内容。以至于 memcached 甚至没有给你删除缓存键的方法。您只能将其替换为另一个值或 null。哦,既然答案对您有帮助,请考虑接受它:)
    • 顺便说一句,ActiveSupport::Cache::RedisStore 也支持delete_matched。如果在大型 Redis 缓存上使用,最好避免它。
    【解决方案2】:

    问题是当使用正则表达式作为片段名称时,请尝试使用字符串作为片段名称。也许会变得冗长。我对 Dalli(使用 Memcached)也有类似的问题,这就是原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      相关资源
      最近更新 更多