Scaling Rails Episode #3 - Cache Expiration

キャッシュ失効の話

前回からの続き

Expiring Caches

  1. controllerのupdate,destroy,createの各メソッドにexpire_pageを書くのはDRYじゃないなー
  2. コントローラーのafter_filterでexpire_pageをまとめたメソッドをまとめてみた
  3. appがbiggerになると複数controllerで失効処理が必要なってくるねーどうする?
    • application_controller?
    • shared objects

  • sweepers(失効処理のshared objects)
    • observeres the controller
    • observses the model

Sweepers

  • Sweeperの作り方
    • sweepersを置くディレクトリを適当につくる
    • config.load_pathにそのディレクトリを追加する
    • ActionController::Caching::Sweeperを継承したSweeperクラスを作る

例)

class PostsSweeper < ActionController::Caching::Sweeper
  observe Post

  def after_save(post)
    clear_posts_cache(post)
  end 

  def after_destroy(post)
    clear_posts_cache(post)
  end 

  def clear_posts_cache(post)
    expire_page :controller => :posts, :action => :index
    expire_page :controller => :posts, :action => :show, :id => post
  end 
end
    • コントローラーにSweeperを使う定義をかく
class PostsController < ApplicationController
  caches_page :index, :show
  cache_sweeper :posts_sweeper
  • Sweeper Hooks
    • AR Observer Callbacks
      • after_createとかafter_destoryとか
    • Controller Callbacks
      • before/after_
      • before_after__