2011-01-16 6 views
3

私はRailsでWebベースのIMAPクライアントを作成しており、リクエスト間にIMAPオブジェクトをキャッシュしたいと考えています。私はオブジェクトをシリアライズし、Redisで保存する予定です(文字列のみをキャッシュするので)。しかし、一般的なシリアライズメソッドは動作していないようです。Ruby/RailsでNet :: IMAPオブジェクトをキャッシュ/シリアル化するにはどうすればよいですか?

元帥とactivesupportの::キャッシュ:: 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 

任意のルビオブジェクト、特に内部的にスレッドを使用している可能性がある他の代替キャッシュメカニズムがありますか?代替キー値ストア(私はRedisを使用しています)がそのようなキャッシュをサポートしていますか? さらに良いですが、とにかくRailsにはがありますか?私はそれらをデシリアライズするのではなく、特定のオブジェクトを覚えていますか?

PS> MacBookでRuby 1.9.2とRails 3.0.3を使用しています。

答えて

1

シリアル化は、データオブジェクト(またはオブジェクトのデータの一部)に対してのみ機能します。ネットワーク接続は、クライアント、サーバー、時間に非常に限定されているため、シリアル化することはできません(デフォルトでは、tcp接続は5分後にタイムアウトします)。アプリケーション内でメモリに置くグローバルIMAP接続を使用することもできますが、複数のユーザーで問題が発生する可能性があります。最も標準的な方法は、あなたが接続を借りる場所にプールを持つことです。 ところで、毎回接続を作成するときに問題にぶち当たっていますか?私は接続をキャッシュしませんが、IMAP経由で取得してそこから作業するデータ。

+0

データのシリアライズは、私が今やっていることです(最初はデータと接続の両方をキャッシュしようとしていました)。 グローバルIMAP接続とはどういう意味ですか?あなたはどうやってそれをしますか?クラスレベルの変数? –

関連する問題