Rails附带了一个方便的会话哈希,我们可以在其中填充内容.但是,我会喜欢ASP的应用程序上下文,它不是仅在一个会话中共享数据,而是与同一应用程序中的所有会话共享它.我正在编写一个简单的仪表板应用程序,并希望每5分钟提取数据,而不是每个会话每5分钟提取一次.
当然,我可以将缓存更新时间存储在数据库中,但到目前为止还不需要为此应用程序设置数据库,并且如果可能的话,我们希望避免这种依赖.
那么,有没有办法得到(或模拟)这种东西?如果在没有数据库的情况下没有办法做到这一点,Rails附带的任何"假"数据库引擎是否都在内存中运行,但是在重新启动之间不会产生持久数据?
正确答案: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%.