我知道Rails.cache
是ActiveSupport::Cache::MemoryStore
,并且它不是线程安全的。
我不明白,为什么rails使用线程不安全的缓存作为其默认值?为什么不使用ActiveSupport::Cache::SynchronizedMemoryStore
?在我看来,在一个网站中,如果缓存不是线程安全的,它几乎没用,因为请求不是在一个线程中处理的。
您在webapp中使用Rails.cache
吗?你怎么用它?
答案 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使用默认的缓存实现 是线程安全的。"