Для чего используется ActiveSupport::Cache::Strategy::LocalCache?

В моем производственном стеке промежуточного программного обеспечения во всех средах я вижу этот одноразовый экземпляр:

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

Я экспериментировал, удаляя все, что мог придумать, связанный с кешированием, но я не могу понять, откуда это взялось.

Что это?

2 ответа

Решение

В абстрактном виде он оборачивает другой кэш в кэш в памяти на время блока, а затем очищается после блока.

На практике я считаю, что он используется в Rails/Rack для обертки любого настроенного вами кэша (memcached, disk) в кэш в памяти, который очищается в конце запроса. Идея состоит в том, что если вы извлекаете один и тот же ключ кэша дважды в одном запросе, он будет кэширован в оболочке 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

Во-первых, я хотел бы показать вам некоторые методы из официального документа.

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, будут поддерживаться кэшем в памяти на время блока. Повторные вызовы кеша для одного и того же ключа попадут в кеш в памяти для более быстрого доступа.

Я надеюсь, что это поможет вам!

Другие вопросы по тегам