Если я установлю это в моей среде,
config.action_controller.cache_store = :mem_cache_store
ActionController::Base.cache_store
будет использовать хранилище memcached, но Rails.cache вместо этого будет использовать хранилище памяти:
$ ./script/console
>> ActionController::Base.cache_store
=> #<ActiveSupport::Cache::MemCacheStore:0xb6eb4bbc @data=<MemCache: 1 servers, ns: nil, ro: false>>
>> Rails.cache
=> #<ActiveSupport::Cache::MemoryStore:0xb78b5e54 @data={}>
В моем приложенииЯ использую Rails.cache.fetch(key){ object }
для кэширования объектов внутри моих помощников.Все это время я предполагал, что Rails.cache
использует хранилище memcached, поэтому я удивлен, что оно использует хранилище памяти.
Если я изменю настройку cache_store
в моей среде на
config.cache_store = :mem_cache_store
и ActionController :: Base.cache_store, и Rails.cache теперь будут использовать одно и то же хранилище памяти, чего я и ожидаю:
$ ./script/console
>> ActionController::Base.cache_store
=> #<ActiveSupport::Cache::MemCacheStore:0xb7b8e928 @data=<MemCache: 1 servers, ns: nil, ro: false>, @middleware=#<Class:0xb7b73d44>, @thread_local_key=:active_support_cache_mem_cache_store_local_cache>
>> Rails.cache
=> #<ActiveSupport::Cache::MemCacheStore:0xb7b8e928 @data=<MemCache: 1 servers, ns: nil, ro: false>, @middleware=#<Class:0xb7b73d44>, @thread_local_key=:active_support_cache_mem_cache_store_local_cache>
Однако, когда я запускаю приложение, я получаю «маршал дамп"ошибка в строке, где я звоню Rails.cache.fetch(key){ object }
no marshal_dump is defined for class Proc
Extracted source (around line #1):
1: Rails.cache.fetch(fragment_cache_key(...), :expires_in => 15.minutes) { ... }
vendor/gems/memcache-client-1.8.1/lib/memcache.rb:359:in 'dump'
vendor/gems/memcache-client-1.8.1/lib/memcache.rb:359:in 'set_without_newrelic_trace'
Что дает?Rails.cache
предназначен для хранения памяти?Должен ли я звонить controller.cache_store.fetch
в тех местах, где я звоню Rails.cache.fetch
?