当从内存存储区更改为memcached存储区时,Rails.cache会抛出“marshal dump”错误

时间:2010-04-07 09:38:32

标签: ruby-on-rails

如果我在我的环境中设置它

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 }

的行中出现“marshal dump”错误
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吗?

1 个答案:

答案 0 :(得分:2)

您无法封送其中包含过程或lambda的对象。这是Ruby解释器的当前限制。你究竟在缓存中存储了什么?整个物体?或只是ID?告诉我你在缓存中存储的内容,有人可以帮助你搞清楚。