我有一个API端点,可以聚合来自代码的大量数据,这些代码利用Rails.cache来处理小块数据。但是,有时我想要100%的最新数据,就像Rails.cache是空的一样。显然,我可以在聚合数据之前清除缓存,但这会影响不相关的数据和请求。
有没有办法让我在rails中有一个请求,好像Rails.cache是空的,类似于如果Rails.cache配置为:null_store?
ActiveRecord中的查询缓存具有类似这样的内容 - 一个“未缓存”函数,您可以将块传递给该块,其中块将在未启用查询缓存的情况下运行。我需要类似的东西,但对于Rails.cache一般。
答案 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”以获得相同的效果 - 只需要更加小心跨请求的线程重用。