在我所有环境中的生产中间件堆栈中,我看到了这个一次性的实例:
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x7f38095d>
我已经通过删除与缓存相关的所有内容进行了实验,但我无法弄清楚它来自哪里。
这是什么?
答案 0 :(得分:2)
在摘要中,它在块的持续时间内使用内存缓存包装另一个缓存,然后在块之后清除。
在实践中,我相信它在Rails / Rack中用于包含您配置的任何缓存(memcached,disk)以及在请求结束时清除的内存缓存。这个想法是,如果你在一个请求中两次获取相同的缓存键,它将在第一个请求的包装LocalCache中缓存,并在第二个请求时从内存加载(而不是再次到达memcached服务器/磁盘)
来自文档:
实现LocalCache的缓存将在块的持续时间内由内存缓存支持。对缓存重复调用相同密钥将访问内存缓存以便更快地访问。
的RDoc: http://api.rubyonrails.org/classes/ActiveSupport/Cache/Strategy/LocalCache.html
答案 1 :(得分:1)
首先,我想向您展示官方文件中的一些方法。
ActiveSupport::Cache::DalliStore#with_local_cache
def with_local_cache
use_temporary_local_cache(LocalStore.new) { yield }
end
def use_temporary_local_cache(temporary_cache)
save_cache = LocalCacheRegistry.cache_for(local_cache_key)
begin
LocalCacheRegistry.set_cache_for(local_cache_key, temporary_cache)
yield
ensure
LocalCacheRegistry.set_cache_for(local_cache_key, save_cache)
end
end
def write(name, value, options=nil)
options ||= {}
name = expanded_key name
instrument(:write, name, options) do |payload|
with do |connection|
options = options.merge(:connection => connection)
write_entry(name, value, options)
end
end
end
def write_entry(key, entry, options) # :nodoc:
local_cache.write_entry(key, entry, options) if local_cache
super
end
现在,我们在实践中使用它们。
@cache = Rails.cache
@cache.with_local_cache do
@cache.write('key', 'value')
end
如果您合并上述代码,您会发现应该有两个缓存('key', 'value')
对的地方。一个是LocalCache
,另一个是@cache
。它的目的在源代码中明确声明。
实现LocalCache的缓存将由内存缓存支持 块的持续时间。对同一个密钥重复调用缓存会命中 内存缓存可以更快地访问。
我希望这对你有帮助!