Ruby on rails 在Rails 3中何时/缓存什么

Ruby on rails 在Rails 3中何时/缓存什么,ruby-on-rails,caching,Ruby On Rails,Caching,缓存是我很长一段时间以来一直忽略的事情,因为我所从事的项目都是在本地内部网上进行的,活动很少。我现在正在做一个更大的Rails 3个人项目,我正在努力找出应该缓存什么以及什么时候缓存东西 人们通常如何确定这一点 如果我知道一个站点的活动相对较少,我是否应该缓存每个页面 如果我有一个调用多个部分的页面,那么最好在这些部分中进行片段缓存,还是在这些部分上进行页面缓存 RubyonRails指南很好地解释了Rails 3中的缓存是如何工作的,但是我很难理解与之相关的决策过程。永远不要为了缓存而缓存,缓

缓存是我很长一段时间以来一直忽略的事情,因为我所从事的项目都是在本地内部网上进行的,活动很少。我现在正在做一个更大的Rails 3个人项目,我正在努力找出应该缓存什么以及什么时候缓存东西

  • 人们通常如何确定这一点
  • 如果我知道一个站点的活动相对较少,我是否应该缓存每个页面
  • 如果我有一个调用多个部分的页面,那么最好在这些部分中进行片段缓存,还是在这些部分上进行页面缓存

  • RubyonRails指南很好地解释了Rails 3中的缓存是如何工作的,但是我很难理解与之相关的决策过程。

    永远不要为了缓存而缓存,缓存是因为有需要的(除了像主页这样的东西,你知道它将非常流行。)启动该站点,或者解析日志,或者使用类似的方法查看什么是慢的。从那里,你可以找出什么是值得缓存的

    一般来说,如果某件事情需要500毫秒才能完成,你应该缓存,如果时间超过1秒,你可能在请求中做得太多了,你应该将你正在做的任何事情都转移到后台进程中……例如,获取推特提要或处理图像


    编辑:,他链接到一些很棒的屏幕广播(虽然基于Rails 2,但理论是一样的)。

    你需要考虑缓存几种东西:

    • 经常被点击但很少更改的请求
    • 绘制“昂贵”的请求、大量的数据库调用等。希望这些很少发生变化
    缓存的另一个不应该不提的方面是过期。这通常也是最难的部分。您必须知道缓存何时不再良好,并将其清除,以便生成新内容。清扫器或观察者(取决于您实现缓存的方式)可以帮助您实现这一点。您也可以仅基于时间值来执行此操作,允许缓存具有最长时间,并在这之后清除它们,无论发生什么

    至于片段缓存与完整页面缓存,请根据更新这些部分的频率来考虑。如果一个页面的3个部分从未更新过,其中一个是,可能您希望缓存这3个部分,并允许实时获取该1,这样您就可以达到第二个精度。或者,如果一个页面的不同部分应该有不同的缓存规则:可能会缓存“timeline”部分,但缓存时间为1分钟。而“朋友”部分则被缓存12小时


    希望这有帮助

    如果站点活动相对较少,则不应缓存任何页面。缓存是因为性能问题,而性能问题是因为要查询的数据太多、用户太多,或者更糟糕的是,这两种情况同时发生

    在考虑缓存之前,您要做的第一件事是查看应用程序中占用时间最多的请求。不是最慢的请求,而是应用程序执行请求的总时间最多。也就是说,如果您有一个请求a在1500毫秒时运行10次,请求B在250毫秒时运行5000次,那么您首先要优化B

    实际上,通过
    production.log
    提取渲染时间和URL,将它们合并到一个简单的报告中,非常容易
    grep
    。如果你愿意,你甚至可以实时完成

    一旦您确定了一个有问题的请求,您就开始区分它正在做什么来服务请求。第一件事是寻找任何查询,这些查询可以通过使用急切加载或通过向前看一点来预测您需要什么来组合。下一件事是确保您没有加载未使用的数据

    很多时候,你会看到列出用户的代码,它会加载每个人50KB的个人简历数据,他们的Facebook和Twitter句柄,几乎所有关于他们的信息,你使用的只是他们的名字

    取尽可能少的,并以最有效的方式取。使用
    连接。当您不需要模型时,选择\u行

    下一步是查看正在运行的查询类型,以及它们的性能如何。确保所有索引都已正确设置并正在使用。检查您没有执行复杂的
    JOIN
    操作,这些操作可以通过一点战术反规范化来解决

    查看您在应用程序中存储的数据,并尝试查找可以从生产数据库中删除并存放在其他地方的数据。当数据不再相关时,定期循环输出数据,如果需要,将其保存在单独的数据库中

    然后检查一下数据库服务器是如何调优的。它是否有足够大的缓冲区?它是在可以以名义成本升级更多内存的硬件上吗?太多的人正在运行一个完全未经调优的数据库服务器,通过一些简单的设置,他们可以获得十倍的性能提升

    如果且仅在此时您仍然存在性能问题,那么您可能需要考虑缓存。

    你知道为什么不先缓存吗?这是因为一旦缓存了某些内容,缓存的数据就会立即过时。如果应用程序的某些部分在假定这些数据始终是最新的情况下使用这些数据,则会出现问题。如果在数据发生更改时不使此缓存过期,则会出现问题。如果你缓存了数据,再也不使用它,你只是阻塞了你的缓存,你会有问题。基本上,当你使用缓存时,你会遇到很多问题,所以这通常是最后的选择