3

caches_page特定のコントローラー/アクションを使用するアプリケーションがあります。キャッシュを期限切れにするために、スイーパーを使用します。全体として、これは標準的なソリューションです。

ただし、一部の変更により、サーバーで要求が殺到する可能性があるため (プッシュ通知が送信され、クライアント デバイスが新しいデータをフェッチするようになる可能性があるため)、キャッシュを事前にレンダリングできるようにしたいと考えています。もちろん、最初のリクエストが自動的にキャッシュに書き込まれるのを待つこともできますが、この場合、リクエストが来ること、多くのリクエストがある可能性、およびそれらが近くにある可能性があることを知っています-同時に。というわけで、キャッシュを用意したいと思います。

複雑さを増すために、更新は通常の Web ページを介して行われ、ほとんどがスキャフォールディングされた標準のコントローラーで処理されますが、キャッシュしたい「ページ」は、API として機能するまったく異なるコントローラーの JSON 応答です。

では、スイーパー (またはキャッシュ期限切れの更新を処理するコントローラー) から新しいページ キャッシュをトリガーして、すぐに書き込むにはどうすればよいでしょうか?

別の言い方をすると、あるコントローラーから別のコントローラーへの内部要求を行うにはどうすればよいですか?


編集:以下に示すようなことをしてしまいました。それほどエレガントではありませんが、効果的です

class ModelSweeper < ActionController::Caching::Sweeper
  observe Model

  def after_create(model)
    expire_pages_for(model)
  end

  def after_update(model)
    expire_pages_for(model)
  end

  def after_destroy(model)
    expire_pages_for(model)
  end

  protected

    def expire_pages_for(model)
      # expire index page
      expire_and_bake(models_url)

      # expire show page
      expire_and_bake(model_url(model))
    end

    def expire_and_bake(url)
      # extract the path from the URL
      path = url.sub(%r{\Ahttp://[^/]+}, "")

      # expire the cache
      expire_page(path)

      # request the url (writes a new cache)
      system "curl '#{url}' &> /dev/null &"
    end

end
4

1 に答える 1

2

サーバーのキャッシュをウォームアップすることは、アプリケーション ロジックの範囲外になる場合があります。curl コマンドをラップして Web サイトのすべての領域をループする rake タスクを使用する前に、キャッシュ ウォーミング システムを実装しました。

# lib/tasks/curl.rake
desc "curl"
task :curl do
  paths.each do |path|  
  `curl #{path}`
  end
end

このタスクは、Rails プロジェクト ルート内から「rake curl」を発行することで呼び出すことができます。

または、キャッシュを期限切れにした後、スイーパー メソッド内からこの rake タスク (curl をラップする) を呼び出すこともできます。Rails アプリケーション コード内からバックグラウンドで rake タスクを呼び出す際に、Railscast Ryan Bates が行ったことを確認してください: http://railscasts.com/episodes/127-rake-in-background

curl の詳細については、http: //curl.haxx.se/docs/manpage.htmlをご覧ください。

于 2012-02-24T02:09:30.920 に答える