2012-05-10 10 views
2

私は私はいくつかの意味を見ることができる、以下の引用を撮影しました:「キャッシュされたページおよびフラグメントは、通常モデルの状態に依存モデルまたはResqueワーカーでフラグメントキャッシュをどのように期限切れにしますか?

キャッシュは、関連するモデルを、アクションが作成され気に変更したり、破壊しません通常のオブザーバを使用することは、有効期限切れキャッシュのための最良の選択であるように思われます。

たとえば、モデルを更新するresqueワーカーがあります。モデルの更新/作成時に期限切れになるためには、フラグメントキャッシュが必要です。これはスイーパーではできません。

しかし、オブザーバを使用すると、私はモデルやResque仕事のいずれか、のようなものが必要になります意味:

ActionController::Base.new.expire_fragment('foobar') 

モデル自体は、キャッシングについて知るべきではありません。これはまた、醜い結果につながるMVCの原則を破ります。

答えて

3

ActiveRecord::Observerを使用してモデルの変更を監視します。キャッシュを期限切れにすることができます。

+0

これは良いアプローチのように見えます。それでも、私は '/ app/models/foo_observer.rb'でキャッシュを期限切れにすることに熱心ではありません。 'foo_observer.rb'はキャッシュについて知ってはいけないと思います。 MVCのコンセプトを破棄します。 –

+0

「オブザーバー」にコードを置くと、あなたが与えた理由からモデルと分離されます。モデルはこの副作用を知るべきではありません。 オブザーバはモデルではありません。モデルの後に名前を付ける必要はありません。名前に高次の問題を使用します。オブザーバを使用してMVCを「破壊する」というのは少しです。 良いアプリは科学ではなくエンジニアリングです。絶対的な純度を望むなら、キャッシュしないでください。 –

0

私は、これは、特にキャッシュの有効期限のオブザーバーの多くを作成することなく行うことができるように見えますRails Guide - Caching with Rails: An overview

http://guides.rubyonrails.org/caching_with_rails.html#sweepers

sweepersにこのセクションを見直しお勧めします。

+0

私は掃除機について読んだことがあります。問題は、私はResqueの仕事からスイーパーを呼び出すことはできません –

2

良いと簡単な解決策は期限切れではなく、コンテンツが異なる場合に異なるキーでキャッシュすることです。ここでは例としてその記事が更新または削除して、ハッシュが異なるため、それはキャッシュを欠場する、それを再度フェッチます

<% cache "post-#{@post.id}", @post.updated_at.to_i do %> 

あるので、それは一種の有効期限が切れると、新しい値をキャッシュします。私はあなたがこれを行うことによっていくつかの問題を抱えることができると思います。たとえば、キャッシュとしてhtmlファイルを作成するRailsのデフォルトキャッシュを使用している場合、しばらくしてから公開ディレクトリにたくさんのファイルを作成するので、あなたのアプリケーションはmemcachedのようなものを使用するようになりました。メモリを管理して、他のものをキャッシュする必要があれば古いキャッシュされたレコード/ページ/パラレンシャルを削除します。

+0

私はこのアプローチも推奨しています。あなたがキャッシュディレクトリを埋めることを心配しているなら、夜間の仕事を空にすることができます。 –

+0

に感謝@LarryK、私は言及したかったが、最後に私はそれを忘れてしまった。 –

+0

すごく簡単でクリーンな方法 – Ben

3

あなたはあなたのビューテンプレートに引数としてモデルを渡すことで、キャッシュを自動的に期限切れにすることができます

<% cache @model do %> 
    # your code here 
<% end %> 
舞台裏で何が起こっている

が名前付きキャッシュある[モデル]/[ID] - [updated_atの]創造された。モデルにはメソッドcache_keyがあり、これはモデルIDとupdated_atタイムスタンプを含む文字列を返します。モデルが変更されると、フラグメントのupdated_atタイムスタンプが一致せず、キャッシュが再生成されます。

これははるかに良いアプローチであり、バックグラウンドワーカーやコントローラー/オブザーバーでのキャッシュの期限切れを心配する必要はありません。

ライアンベイツも話題に支払わRailscastがあります:Fragment Caching

関連する問題