【问题标题】:Page caching using delayed job使用延迟作业的页面缓存
【发布时间】:2011-06-10 03:34:10
【问题描述】:

大家好,如果您曾经在 [craigslist] 上发过帖子,那么这个问题对您来说应该是有意义的。每当您发布列表(例如,出售家具或公寓)时,您的列表不会立即出现在网站上。相反,列表将每隔 10-15 分钟分批出现(数量不同)。起初我真的过度思考这种行为,试图保存记录然后进行批量插入,但我意识到它要简单得多。在与一些同事交谈后,Craigslist 正在缓存他们的页面,然后每 10-15 分钟清空一次缓存是有道理的。这大大减少了他们数据库的负载。

现在,我的问题。我如何在 Rails 中完成同样的事情?我知道如何实现缓存 - 我已经阅读了 [使用 Rails 进行缓存指南]。我将使用动作缓存和片段缓存(因为我无法缓存整个页面)。我仍然需要进行验证和访问控制,所以我无法完全缓存页面...

【问题讨论】:

    标签: ruby-on-rails caching optimization ruby-on-rails-3


    【解决方案1】:

    要完成定时页面缓存,您可以利用标准 Rails 的缓存加上一点定时技巧。

    首先,您要确定您的缓存级别。您有三个选择:

    1. Page Caching - 缓存整个页面,但后续请求不会通过 Rails 堆栈。因此,如果这是一个 Craiglist 式的页面,每秒会被点击数千次,则此请求只会发送到您的网络服务器(例如 apache),而不是 Rails 或您的数据库,从而使其速度更快。代价是您丢失了 Rails 提供的身份验证、会话变量等。
    2. Action Caching - 缓存整个页面,但将请求带入 Rails,以便它可以执行与该操作相关的任何过滤器。
    3. Fragment Caching - 缓存页面的一部分,基本上绕过了在块中执行代码的需要(以及对数据库的任何后续调用)。

    然后您需要选择适当级别的缓存并在您的应用中实现它(查看上面的链接以获取实现示例)。

    一旦你实现了缓存,你现在必须想办法让缓存过期。我可以想到两种方法来做到这一点,两者都有好处和缺点。现在让我们假设您选择使用动作缓存。

    1. 可靠但更复杂 - 在您的控制器中创建一个使缓存过期的操作和一个向该操作发出请求的 cron 作业任务。我问了一个类似的问题来解决这个'built in' scheduled task。为了安全起见,您可能希望包含生成的哈希或类似的东西,以便有人无法通过转到“/products/expire_cache”手动使您的缓存过期。

      class ProductsController < ApplicationController
        caches_action :index
      
        def index
          # implementation
        end
      
        def expire_cache
          if params[:verification_hash] == 'sa89sf8sfsfehiwaf89yfea98fh'
            expire_action :action => :index
          end
        end
      end
      
    2. 不可靠但更简单 - 只需使用任意条件使您的操作中的缓存过期。此实施假设将有足够的流量来定期确保有人会在 0、15、30 和 45 分钟内访问您的站点。您可以缩短此时间间隔,以确保以更可能的时间间隔重置缓存。

      class ProductsController < ApplicationController
        caches_action :index
      
        def index
          # implementation
          expire_action :action => :index if Time.now.min % 15 == 0
        end
      end
      

    【讨论】:

    • 如果索引动作被缓存,expire_action真的会被调用吗?
    【解决方案2】:

    我认为你想要完成的有两种方法:

    1. 仅使用片段和操作进行缓存,以便在第一次点击页面时访问数据库并正常加载页面,但每次后续点击都来自缓存的版本。这种方法的主要优点是您无需处理延迟作业和在常规流程之外渲染页面。
    2. 创建一个延迟作业来呈现您的页面或缓存的各个片段。在延迟作业的渲染过程中,页面片段实际上会被缓存,就像用户正在查看它们一样(前提是您已经正常实现了片段和动作缓存)。延迟作业完成后,在您的数据库中填充一列,指示此记录/页面已准备好查看。

    【讨论】:

      【解决方案3】:

      caching in Rails 的最简单方法可能是将Memcached:expires_in 选项一起使用。

      您可能需要一个 VPS 服务器来使用它,这对于小型网站来说可能很昂贵。

      但是即使没有 memcached,您也可以很好地进行基于时间的缓存。这个小小的SimpleCachesn-p 为我的共享托管网站创造了奇迹。

      【讨论】:

        猜你喜欢
        • 2015-12-18
        • 2012-04-20
        • 2016-03-29
        • 1970-01-01
        • 2011-03-09
        • 1970-01-01
        • 2011-12-14
        • 2022-11-10
        • 2015-10-02
        相关资源
        最近更新 更多