【问题标题】:Why Rails.cache is not thread safe?为什么 Rails.cache 不是线程安全的?
【发布时间】:2010-06-18 06:32:54
【问题描述】:

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

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

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

【问题讨论】:

  • 我知道这是一个老问题,试图帮助阻止对野鹅的追逐。 MemoryStore 中的线程安全问题显然已得到修复,并且 SynchronizedMemoryStore 已被弃用。 [github.com/rails/rails/commit/…

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


【解决方案1】:

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

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

对于中小型应用程序,您可能会很好地使用默认文件存储。如果您需要扩展,您应该查看ActiveSupport::Cache::MemCacheStore

【讨论】:

  • 感谢您的回答。我是一名 Java 开发人员,我认为 Rails 就像 Java,一个进程和多个线程。你的意思是,当一个请求到来时,只有一个进程(所以一个线程)来处理它?如果我想要一个globe缓存,我必须考虑其他缓存产品,比如'memcached'?
  • @Freewind:有几个进程,但每个进程一次只处理一个请求。我建议您从FileStore 缓存开始。它是一个全局缓存,通常不需要任何额外的配置,因此很容易上手。如果需要,您可以随时切换到memcached,但由于它需要额外的配置(您必须保持memcached 服务器运行),从FileStore 开始更容易,并且只切换到memcached以后有需要的话。
【解决方案2】:

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

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

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

ActionController::Base.cache_store = :synchronized_memory_store

【讨论】:

  • @Freewind:是的,没错。正如 molf 和我所回答的那样,请求通常在单独的进程中处理。通常你有一个工作进程池,每个新请求都会转到第一个不忙于处理另一个请求的进程。所以是的,如果你想要一个全局缓存,你应该使用例如FileStoreMemCacheStore,它们都可以跨进程工作。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2012-11-20
    • 2013-10-11
    • 2020-10-10
    • 2016-08-14
    • 2023-03-12
    • 1970-01-01
    • 2023-03-30
    • 2012-03-22
    • 2015-07-24
    相关资源
    最近更新 更多