2

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

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

Rails.cache在你的webapp中使用吗?以及如何使用它?

4

3 回答 3

4

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

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

对于中小型应用程序,您可能会很好地使用默认文件存储。如果您需要超出此范围,则应该查看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 回答
1

从 Rails 3.1 版开始,默认的 Rails 缓存(ActiveSupport::Cache MemoryStore)是线程安全的:http ://api.rubyonrails.org/v3.1.0/files/activesupport/CHANGELOG.html 正如 CHANGELOG 注释:“Make thread安全,因此 Rails 使用的默认缓存实现是线程安全的。”

于 2018-02-18T15:09:20.227 回答