3

在所有环境中的生产中间件堆栈中,我看到了这个一次性实例:

use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x7f38095d>

我已经尝试删除所有我能想到的与缓存相关的东西,但我无法弄清楚它来自哪里。

它是什么?

4

2 回答 2

2

首先,我想向您展示官方文档中的一些方法。

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 的缓存将在一个块的持续时间内由内存中的缓存支持。对同一个键的缓存重复调用将命中内存缓存以获得更快的访问。

希望对你有帮助!</p>

于 2014-07-28T16:30:05.647 回答
2

在抽象中,它在一个块的持续时间内用内存中的缓存包装另一个缓存,然后在块之后被清除。

在实践中,我相信它在 Rails/Rack 中用于包装您配置的任何缓存(memcached,磁盘),并在请求结束时清除内存缓存。这个想法是,如果您在一个请求中两次获取相同的缓存键,它将在第一个请求时缓存在包装 LocalCache 中,并在第二个请求时从内存中加载(而不是再次访问 memcached 服务器/磁盘) .

从文档:

实现 LocalCache 的缓存将在一个块的持续时间内由内存中的缓存支持。对同一个键的缓存重复调用将命中内存缓存以获得更快的访问。

Git 历史: https ://github.com/rails/rails/commits/master/activesupport/lib/active_support/cache/strategy/local_cache.rb

RDoc: http ://api.rubyonrails.org/classes/ActiveSupport/Cache/Strategy/LocalCache.html

于 2014-02-26T08:29:22.553 回答