我知道Rails.cache
是ActiveSupport::Cache::MemoryStore
,而且它不是线程安全的。
我不明白,为什么 Rails 使用线程不安全缓存作为默认缓存?为什么不使用ActiveSupport::Cache::SynchronizedMemoryStore
?在我看来,在一个网站中,如果缓存不是线程安全的,它几乎没有用,因为请求不是在一个线程中处理的。
你Rails.cache
在你的webapp中使用吗?以及如何使用它?
我知道Rails.cache
是ActiveSupport::Cache::MemoryStore
,而且它不是线程安全的。
我不明白,为什么 Rails 使用线程不安全缓存作为默认缓存?为什么不使用ActiveSupport::Cache::SynchronizedMemoryStore
?在我看来,在一个网站中,如果缓存不是线程安全的,它几乎没有用,因为请求不是在一个线程中处理的。
你Rails.cache
在你的webapp中使用吗?以及如何使用它?
Rails 中的默认缓存存储是ActiveSupport::Cache::FileStore
,而不是MemoryStore
。
内存存储在实践中的用途有限,因为它仅限于单个进程,这使得它对于使用Passenger 或Mongrel 集群部署的Rails 应用程序毫无用处,其中请求在单独的进程中处理,而不是在单独的线程中。
对于中小型应用程序,您可能会很好地使用默认文件存储。如果您需要超出此范围,则应该查看ActiveSupport::Cache::MemCacheStore
.
Rails 的大多数部署方案实际上都是单线程的。并发是通过自动或预先生成多个进程来实现的。对许多人来说,线程安全并不重要。
确实存在多线程选项(尤其是使用 JRuby),因此您的问题仍然有效。这就是为什么在 Rails 3 中,旧的ActiveSupport::Cache::MemoryStore
已被删除并替换为ActiveSupport::Cache::SynchronizedMemoryStore
,默认情况下使其成为线程安全的。
如果您需要 Rails 2 应用程序中的线程安全,请将以下内容放在您的环境中。
ActionController::Base.cache_store = :synchronized_memory_store
从 Rails 3.1 版开始,默认的 Rails 缓存(ActiveSupport::Cache MemoryStore)是线程安全的:http ://api.rubyonrails.org/v3.1.0/files/activesupport/CHANGELOG.html 正如 CHANGELOG 注释:“Make thread安全,因此 Rails 使用的默认缓存实现是线程安全的。”