ここでは、ビューレイヤーで発生するfragment cachingを探しています。フラグメントのキャッシュと格納されたコンテンツの有効期限は、驚くほど簡単です。 、このコースを
<% cache do %>
<ul>
<% @books.each do |book| %>
<li><%= book.name %></li>
<% end %>
</ul>
<% end %>
:あなたは本のリストを持っているので、のは、あなたのビューは、このようなビットに見えるとしましょう:
<ul>
<% @books.each do |book| %>
<li><%= book.name %></li>
<% end %>
</ul>
は単にcache
でそれをラップし、ちょうどこのビットのキャッシュを有効にするにはキャッシュに名前をつけたり、何か本当に特別なことをしたりしません.Railsはこのキャッシュフラグメントの一意の名前を自動的に選択しますが、それは本当に役立たないでしょう。私たちはより良いことができます。 DHHのkey-based cache expiration技術を使用して、キャッシュにそのコンテンツに関連する名前を付けましょう。キャッシュに引数を渡す
<% cache ['book-list', *@books] do %>
<ul>
<% @books.each do |book| %>
<li><%= book.name %></li>
<% end %>
</ul>
<% end %>
は、指定された引数からキャッシュキーを作成します。文字列は直接渡されるので、ここではキャッシュは常に 'book-list'で始まります。これは、同じコンテンツをキャッシングしている可能性がある他の場所とのキャッシュの衝突を防ぐためですが、ビューは異なります。 @books配列の各メンバに対して、Railsはcache_key
を呼び出します:ActiveRecordオブジェクトの場合、モデルIDから構成された文字列が生成され、オブジェクトが最後に更新されたときに決定的に反映されます。
これは、オブジェクトを更新すると、このフラグメントのキャッシュキーが変更されることを意味します。つまり、自動的に期限切れになる - 本が更新されると、このキャッシュステートメントは存在しないキーを検索し、存在しないと判断して新しいコンテンツを設定します。古くなった古くなったコンテンツは、メモリや年齢の制約によって退去されるまでキャッシュストアに残ります(memcachedはこれを自動的に行います)。
私は、この技術を数多くのプロダクションアプリケーションで使用しています。詳細については、37signals postをチェックし、Railsの一般的なキャッシング情報については、Ruby on Rails caching guideを参照してください。
1:
しばしばあなたも呼び出しをラップすることにより、クエリ自己をキャッシュすることができますし、DBを打つ避けるために。私は通常、テーブル全体で最も最近更新された本のレコードをつかみ、それを使用します。 – cpuguy83
変更されたブックがキャッシュ全体を壊さないように、個々のブックをキャッシュする必要があります。 – cpuguy83