如何绕过单个请求或代码块的Rails.cache?

时间:2014-10-06 19:29:11

标签: ruby-on-rails ruby caching activesupport

我有一个API端点,可以聚合来自代码的大量数据,这些代码利用Rails.cache来处理小块数据。但是,有时我想要100%的最新数据,就像Rails.cache是​​空的一样。显然,我可以在聚合数据之前清除缓存,但这会影响不相关的数据和请求。

有没有办法让我在rails中有一个请求,好像Rails.cache是​​空的,类似于如果Rails.cache配置为:null_store?

ActiveRecord中的查询缓存具有类似这样的内容 - 一个“未缓存”函数,您可以将块传递给该块,其中块将在未启用查询缓存的情况下运行。我需要类似的东西,但对于Rails.cache一般。

1 个答案:

答案 0 :(得分:2)

由于没有出现这种开箱即用的解决方案,我通过添加以下代码作为config / initializers / rails_cache.rb来编写我自己的解决方案

module Rails
  class << self
    alias :default_rails_cache :cache
    def cache
      # Allow any thread to override Rails.cache with its own cache implementation.
      RequestStore.store[:rails_cache] || default_rails_cache
    end
  end
end

这允许任何线程指定自己的缓存存储,然后将其用于所有提取,读取和写入。因此,它不会从默认的Rails.cache中读取,也不会将其值写入默认的Rails.cache。

如果线程长时间运行并且启用了缓存,那么您可以轻松地将其设置为自己的MemoryStore实例:

RequestStore.store[:rails_cache] = ActiveSupport::Cache.lookup_store(:memory_store)

如果你想完全关闭这个线程的缓存,你可以:null_store而不是:memory_store。

如果您没有使用request_store gem,“RequestStore.store”可以替换为“Thread.current”以获得相同的效果 - 只需要更加小心跨请求的线程重用。