为什么Rails.cache不是线程安全的?

时间:2010-06-18 06:32:55

标签: ruby-on-rails caching ruby-on-rails-2

我知道Rails.cacheActiveSupport::Cache::MemoryStore,并且它不是线程安全的。

我不明白,为什么rails使用线程不安全的缓存作为其默认值?为什么不使用ActiveSupport::Cache::SynchronizedMemoryStore?在我看来,在一个网站中,如果缓存不是线程安全的,它几乎没用,因为请求不是在一个线程中处理的。

您在webapp中使用Rails.cache吗?你怎么用它?

3 个答案:

答案 0 :(得分:4)

Rails中的默认缓存存储为ActiveSupport::Cache::FileStore,而不是MemoryStore

内存存储在实践中的用途有限,因为它仅限于单个进程,这使得使用Passenger或Mongrel集群部署的Rails应用程序无用,其中请求在单独的进程中处理,而不是在单独的线程中处理

对于中小型应用程序,您可能会使用默认文件存储区。如果您需要扩展到此范围之外,您应该查看ActiveSupport::Cache::MemCacheStore

答案 1 :(得分:2)

Rails的大多数部署方案实际上都是单线程的。并发是通过自动或事先生成多个进程来实现的。对于许多人来说,线程安全性并不重要。

确实存在多线程选项(尤其是JRuby),因此您的问题仍然有效。这就是为什么在Rails 3中,旧的ActiveSupport::Cache::MemoryStore已被删除并替换为ActiveSupport::Cache::SynchronizedMemoryStore,默认情况下使其成为线程安全的。

如果您需要Rails 2应用程序中的线程安全性,请将以下内容放在您的环境中。

ActionController::Base.cache_store = :synchronized_memory_store

答案 2 :(得分:0)

默认Rails缓存(ActiveSupport :: Cache MemoryStore)从Rails 3.1版开始是线程安全的:http://api.rubyonrails.org/v3.1.0/files/activesupport/CHANGELOG.html 正如CHANGELOG所说:"使线程安全,以便Rails使用默认的缓存实现 是线程安全的。"