Rails.cache выдает ошибку "marshal dump" при переходе из хранилища памяти в хранилище memcached - PullRequest
4 голосов
/ 07 апреля 2010

Если я установлю это в моей среде,

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?

1 Ответ

2 голосов
/ 07 апреля 2010

Вы не можете маршалировать объекты, в которых есть проки или лямбды.Это текущее ограничение интерпретатора Ruby.Что именно вы храните в кеше?Целые объекты?Или только удостоверения личности?Покажите мне, что вы храните в кэше, и кто-то может помочь вам разобраться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...