Rails.cache throws a "marshal dump" error when changing from memory storage to memcached storage

If I installed it in my environment

config.action_controller.cache_store = :mem_cache_store 

ActionController::Base.cache_store will use memcached storage, but Rails.cache uses memory instead:

 $ ./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={}> 

In my application, I use Rails.cache.fetch(key){ object } to cache objects inside my helpers. All this time, I assumed that Rails.cache uses memcached storage, so I'm surprised that it uses memory.

If I changed the cache_store parameter in my environment to

 config.cache_store = :mem_cache_store 

both ActionController :: Base.cache_store and Rails.cache will now use the same memory store as expected:

 $ ./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> 

However, when I run the application, I get a marshal dump error in the line where I call 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' 

What gives? Is Rails.cache storage facility? Should I call controller.cache_store.fetch where I call Rails.cache.fetch ?

+4
source share
1 answer

You cannot marshal objects that have proc or lambda. This is the current limitation of the Ruby interpreter. What exactly do you store in cache? Whole objects? Or just identifiers? Show me what you store in the cache and someone can help you figure it out.

+2
source

Source: https://habr.com/ru/post/1306210/


All Articles