If I set this in my environment
config.action_controller.cache_store = :mem_cache_store
ActionController::Base.cache_store will use a memcached store but Rails.cache will use a memory store 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 app, I use Rails.cache.fetch(key){ object } to cache objects inside my helpers. All this time, I assumed that Rails.cache uses the memcached store so I’m surprised that it uses memory store.
If I change the cache_store setting 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, which is what I expect:
$ ./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 app, 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 meant to be a memory store? Should I call controller.cache_store.fetch in the places where I call Rails.cache.fetch?
You cannot marshal objects that have procs or lambdas in them. It’s a current limitation of the Ruby interpreter. What exactly are you storing in the cache? Whole objects? Or just IDs? Show me what you’re storing in the cache and someone can help you figure it out.