Как мне кэшировать / сериализовать объект Net :: IMAP в Ruby / Rails? - PullRequest
3 голосов
/ 16 января 2011

Я создаю веб-клиент IMAP в Rails и хочу кэшировать объект IMAP между запросами.Я планировал сериализовать объект и сохранить его в Redis (поскольку он кэширует только строки), однако ни один из популярных методов сериализации, похоже, не работает.

Marshal и ActiveSupport :: Cache :: MemoryStore оба даютследующая ошибка

Marshal.dump(imap)
TypeError: no marshal_dump is defined for class Mutex

Сериализация YAML работает, но десериализация не удалась.

s = YAML::dump(imap) # works, i.e. loads up a string with the imap data
imap2 = YAML::load(s)
TypeError: allocator undefined for Thread

Существует ли какой-либо другой альтернативный механизм кэширования, который работает для произвольных объектов ruby, особенно те, которые могут использовать потоки внутри?Поддерживает ли такое кэширование альтернативное хранилище значений ключей (я использовал Redis)?Более того, есть ли в Rails возможность запомнить определенных объектов, а не десериализовать их?

PS> Я использую Ruby 1.9.2 с Rails 3.0.3 на Macbook, еслиэто помогает в любом случае.

1 Ответ

1 голос
/ 16 января 2011

Сериализация работает только для объектов данных (или части данных объекта).Сетевые соединения не могут быть сериализованы, так как они очень специфичны для клиента, сервера и времени (по умолчанию время ожидания tcp-соединения составляет 5 минут).Вы можете использовать глобальное IMAP-соединение, которое вы помещаете в память в вашем приложении, но у вас могут возникнуть проблемы с несколькими пользователями.Самый стандартный способ - создать пул соединений, из которого вы заимствуете соединение.Кстати, вы сталкиваетесь с проблемами при создании соединения каждый раз?Я не кэшировал бы соединение, но данные, которые вы получили через IMAP и работают оттуда.

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