Rails中的应用程序上下文

时间:2008-09-20 18:33:44

标签: ruby-on-rails

Rails带有一个方便的会话哈希,我们可以在其中填充内容。但是,我会喜欢ASP的应用程序上下文,它不是仅在一个会话中共享数据,而是与同一应用程序中的所有会话共享它。我正在编写一个简单的仪表板应用程序,并希望每5分钟提取数据,而不是每个会话每5分钟提取一次数据。

当然,我可以将缓存更新时间存储在数据库中,但到目前为止还不需要为此应用程序设置数据库,并且如果可能的话,我们希望避免这种依赖。

那么,有没有办法获得(或模拟)这种东西?如果没有数据库就无法做到这一点,Rails附带的任何“假”数据库引擎是否都在内存中运行,但是在重新启动之间不会产生持久数据?

7 个答案:

答案 0 :(得分:8)

正确答案:memcached。如今,快速,干净,支持多个流程,与Rails完全整合非常。设置甚至不是那么糟糕,但继续运行还有一件事。

90%回答:可能有多个Rails进程在运行 - 例如,每个Mongrel就有一个进程。根据您的缓存需求的具体情况,很可能每个Mongrel有一个缓存并不是世界上最糟糕的事情。例如,假设您正在缓存长时间运行的查询的结果

  • 每8小时获取一次新数据
  • 每页加载一次,每天20,000次
  • 需要在4个进程(Mongrels)中访问

然后您可以使用大约一行代码将20,000个请求减少到12个

@@arbitrary_name ||= Model.find_by_stupidly_long_query(param)

双重标记,您可能不熟悉的Ruby符号,是一个全局变量。当且仅当变量当前为nil或以其他方式计算为false时,|| =是执行赋值的常用Ruby习惯用法。它会一直保持良好状态,直到你明确地清空它或者直到进程停止为止,无论出于何种原因 - 服务器重启,明确杀死,你有什么。

在你从一天的20k计算到大约15秒内的12次之后(好的,两分钟 - 你需要将它包装在一个简单的if块中,将缓存更新时间存储在不同的全局中),你可能会发现没有必要花费额外的工程资产将其降低到每天4个。

我实际上在我的一个生产站点中使用它,用于缓存一些昂贵的查询,这些查询在过程的生命周期中只需要进行一次评估(即它们仅在部署时更改 - 我想我可以预先计算结果并将它们写入磁盘或数据库,但为什么这样做时SQL可以为我工作)。

你没有得到任何神奇的过期语法,可靠性相当渺茫,并且它不能在进程间共享 - 但它只需要一行代码中的90%。

答案 1 :(得分:3)

答案 2 :(得分:2)

有一个有用的Railscast on Rails 2.1 caching。如果您计划在Rails中使用memcached,这非常有用。

答案 3 :(得分:1)

使用股票Rails缓存大致相当于此。

答案 4 :(得分:0)

@ p3t0r-是对的,MemCached可能是最好的选择,但您也可以使用Rails附带的sqlite数据库。虽然MemCached会在多台机器上运行,但这不会起作用。此外,sqlite将保留到磁盘,但我认为你可以设置它不是你想要的。 Rails本身没有应用程序范围的存储,因为它是作为一个进程的每个请求处理程序运行的,所以它没有像ASP.NET或Java服务器那样的共享内存空间。

答案 5 :(得分:0)

因此,在Rails中你所要求的是非常不可能的,因为它的设计方式。你问的是一个共享对象,Rails是严格的单线程。用于在分布式进程之间共享数据的Memcached或类似工具是唯一的方法。

答案 6 :(得分:0)

Rails.cache冻结它存储的对象。这种方式对缓存有意义,但不适用于应用程序上下文。我想,不是做月球往返完成那个简单的任务,你所要做的就是在config / environment.rb内部创建一个常量

APP_CONTEXT = Hash.new

很简单,啊?