代码之家  ›  专栏  ›  技术社区  ›  Sean McMains

Rails中的应用程序上下文

  •  3
  • Sean McMains  · 技术社区  · 17 年前

    Rails附带了一个方便的会话散列,我们可以将内容塞进其中。但是,我希望ASP的应用程序上下文这样的东西,它不是只在单个会话中共享数据,而是与同一应用程序中的所有会话共享数据。我正在编写一个简单的仪表板应用程序,希望每5分钟提取一次数据,而不是每次会话每5分钟提取一次数据。

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

    那么,有没有办法得到(或模拟)这种东西?如果没有数据库就无法做到这一点,那么有没有任何一种Rails附带的、在内存中运行的“假”数据库引擎,但不需要在重启之间保存数据?

    7 回复  |  直到 17 年前
        1
  •  8
  •   Patrick McKenzie    17 年前

    正确答案 :memcached。快速、干净、支持多流程、集成 非常 这些天来,他们用铁轨把自己弄得干干净净。设置起来也没那么糟糕,但继续运行是另外一件事。

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

    • 每8小时获取一次新数据
    • 每次页面加载时使用,每天20000次
    • 需要在4个进程中访问(杂种)

    然后用一行代码就可以将20000个请求减少到12个

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

    当您在大约15秒内从每天20k的计算量下降到12次后(好吧,两分钟——您需要将其封装在一个简单的if块中,该块将缓存更新时间存储在另一个全局中),您可能会发现无需花费额外的工程资源将其降至每天4次。

    实际上,我在我的一个生产站点中使用它来缓存一些昂贵的查询,这些查询实际上只需要在流程生命周期中评估一次(也就是说,它们只在部署时更改——我想我可以预先计算结果并将其写入磁盘或数据库,但为什么要这样做,因为SQL可以帮我完成这项工作)。

        2
  •  3
  •   RMorrisey    17 年前
        3
  •  2
  •   FlipFlop    17 年前

    有一个有用的方法 Railscast on Rails 2.1 caching . 如果您计划将memcached与Rails一起使用,这将非常有用。

        4
  •  1
  •   hoyhoy    17 年前

        5
  •  0
  •   bhollis    17 年前

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

        6
  •  0
  •   Honza    17 年前

    因此,由于Rails的设计方式,您所要求的在Rails中是完全不可能的。您需要的是一个共享对象,Rails是严格的单线程。Memcached或用于在分布式进程之间共享数据的类似工具是唯一的出路。

        7
  •  0
  •   TraderJoeChicago    16 年前

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

    APP_CONTEXT = Hash.new

    很简单啊??