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