Rails带有一个方便的会话哈希,我们可以在其中填充内容。但是,我会喜欢ASP的应用程序上下文,它不是仅在一个会话中共享数据,而是与同一应用程序中的所有会话共享它。我正在编写一个简单的仪表板应用程序,并希望每5分钟提取数据,而不是每个会话每5分钟提取一次数据。
当然,我可以将缓存更新时间存储在数据库中,但到目前为止还不需要为此应用程序设置数据库,并且如果可能的话,我们希望避免这种依赖。
那么,有没有办法获得(或模拟)这种东西?如果没有数据库就无法做到这一点,Rails附带的任何“假”数据库引擎是否都在内存中运行,但是在重新启动之间不会产生持久数据?
答案 0 :(得分:8)
正确答案:memcached。如今,快速,干净,支持多个流程,与Rails完全整合非常。设置甚至不是那么糟糕,但继续运行还有一件事。
90%回答:可能有多个Rails进程在运行 - 例如,每个Mongrel就有一个进程。根据您的缓存需求的具体情况,很可能每个Mongrel有一个缓存并不是世界上最糟糕的事情。例如,假设您正在缓存长时间运行的查询的结果
然后您可以使用大约一行代码将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)
你应该看一下memcached:http://wiki.rubyonrails.org/rails/pages/MemCached
答案 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
很简单,啊?