私はMemcachedを介してRailsプロジェクトにキャッシュを実装しており、特にサイドカラムブロック(最新の写真、ブログなど)をキャッシュしようとしていますが、現在、15分程度ごとにキャッシュが期限切れになっています。これは機能しますが、新しいコンテンツが追加されたり、更新されたりするたびに、より最新の状態にすることができれば、それはより良いことです。
Memcachedhttp : //content.newrelic.com/railslab/videos/08-ScalingRails-Memcached-fixed.mp4でScalingRailsスクリーンキャストのエピソードを見ていました。ビデオの8:27に、GreggPollackがインテリジェントについて話します。インテリジェントキー(この例ではupdated_atタイムスタンプ)を使用して、キャッシュを期限切れにすることなく以前にキャッシュされたアイテムを置き換える方法でMemcachedにキャッシュします。したがって、タイムスタンプが更新されるたびに、新しいタイムスタンプを探すときにキャッシュが更新されると思います。
この例では「最近の写真」サイドブロックを使用していますが、これが設定方法です...
_side-column.html.erb:
<div id="photos"">
<p class="header">Photos</p>
<%= render :partial => 'shared/photos', :collection => @recent_photos %>
</div>
_photos.html.erb
<% cache(photos) do %>
<div class="row">
<%= image_tag photos.thumbnail.url(:thumb) %>
<h3><%= link_to photos.title, photos %></h3>
<p><%= photos.photos_count %> Photos</p>
</div>
</div>
<%終了%>
最初の実行時に、Memcachedはブロックをviews / photos / 1-20110308040600としてキャッシュし、ページが更新されたときにそのキャッシュされたフラグメントをリロードします。次に、バックエンドのその特定の行に写真を追加してリロードしますが、写真の数は更新されません。ログは、views / photos / 1-20110308040600からまだロード中であり、更新されたタイムスタンプを取得していないことを示しています。私がしていることはすべて、ビデオがしていることと同じように見えますが、上記で何が間違っているのですか?
さらに、この質問にはパート2があります。上記の部分でわかるように、コレクションに対して@recent_photosクエリが呼び出されます(私のlibフォルダー内のモジュールから)。ただし、ブロックがキャッシュされている場合でも、このSELECTクエリが呼び出されていることに気付きました。<%cache(@recent_photos)do%>のように、最初は部分全体をブロックにラップしようとしましたが、明らかにこれは機能しません-特にコレクション全体に実際のタイムスタンプがないため、もちろん個々のアイテムです。結果がすでにキャッシュされている場合、どうすればこのクエリが実行されないようにできますか?
更新 2番目の質問を参照すると、Rails.cache.existがない限り、それがわかりました。私のチケットかもしれませんが、注意が必要なのは、タイムスタンプを使用するワイルドカードの性質です...
UPDATE 2 最初の質問を完全に無視して、キャッシュが更新されなかった理由を正確に理解しました。これは、updated_atフィールドが更新されていなかったためです。その理由は、親のネストされたリソースであるアイテムを追加/削除していたためです。親のupdated_atフィールドを更新するには、おそらくそのアイテムに「タッチ」を実装する必要があります。
しかし、私の2番目の質問はまだ残っています...フラグメントがキャッシュされている場合でも、メインの@recent_photosクエリがまだ呼び出されています... cache.existsを使用する方法はありますか?/ views / photos / 1-2011randomのような名前のキャッシュをターゲットにするには?