2

私は知っていRails.cacheますActiveSupport::Cache::MemoryStore、そしてそれはスレッドセーフではありません。

Rails がデフォルトでスレッドセーフでないキャッシュを使用する理由がわかりません。なぜ使用しないのActiveSupport::Cache::SynchronizedMemoryStoreですか?私の意見では、Web サイトでは、キャッシュがスレッド セーフでない場合、リクエストは 1 つのスレッドで処理されないため、ほとんど役に立ちません。

あなたのウェブアプリで使用Rails.cacheしていますか?そして、それをどのように使用しますか?

4

3 に答える 3

4

Rails のデフォルトのキャッシュ ストアは でありActiveSupport::Cache::FileStore、 ではありませんMemoryStore

メモリ ストアは、単一のプロセスに制限されているため、実際には用途が限られています。これは、Passenger を使用してデプロイされた Rails アプリや、要求が個別のスレッドではなく個別のプロセスで処理される Mongrel クラスターには役に立たないからです。

小規模から中規模のアプリケーションの場合は、デフォルトのファイル ストアで十分でしょう。それを超えてスケ​​ーリングする必要がある場合は、 を参照してくださいActiveSupport::Cache::MemCacheStore

于 2010-06-18T06:55:14.877 に答える
2

Rails の展開シナリオのほとんどは、実際にはシングルスレッドです。並行性は、複数のプロセスを自動的に、または事前に生成することによって実現されます。多くの人にとって、スレッドセーフはそれほど重要ではありません。

マルチスレッドのオプションは (特に JRuby では) 存在するので、あなたの質問はまだ有効です。これが、Rails 3 で古いものActiveSupport::Cache::MemoryStoreが削除されて に置き換えられActiveSupport::Cache::SynchronizedMemoryStore、デフォルトでスレッドセーフになった理由です。

Rails 2 アプリでスレッド セーフが必要な場合は、以下を環境のどこかに配置します。

ActionController::Base.cache_store = :synchronized_memory_store
于 2010-06-18T06:55:19.743 に答える