4

Dalli を使用して Rails アプリでキャッシュ ストアを操作しようとしています。私はフラグメントキャッシングだけを行っており、開発構成を次のように設定しています。

#config.action_controller.perform_caching = true
config.cache_store = :dalli_store

すべてをキャッシュしていないように。私がキャッシングに興味を持っているフラグメントは次のようなものです:

<% cache("home_main", :expires_in => 1.minute) do %>
<div class='tabbed-content content-1'>
  <%=render :partial => 'shared/launch-main', :locals => { :locations => @locations } %>
</div>
<% end %>

入って走ったら

ruby-1.9.2-p290 :019 > Rails.cache.stats
ruby-1.9.2-p290 :019 > y _

私は得る:

conn_yields: '0'
 bytes: '17153'
 curr_items: '1'
 total_items: '5'
 evictions: '0'
 reclaimed: '0'

そのフラグメントキャッシュを取り戻す方法はありますか? それとも見る?私は試した:

Rails.cache.fetch('home_main')

しかし、それは機能していません。キャッシュ キーのリストを表示する方法はありますか?

どうも

編集#1

@ cpuguy83の場合-明らかに196msでDBに移動します:-(

Read fragment views/home_main (2.4ms)
Rendered index/homepage_launch_main.html.erb (2.8ms)
Completed 200 OK in 1623ms (Views: 11.5ms | ActiveRecord: 195.8ms)
4

1 に答える 1

5

フラグメント キャッシングは、アドレスと URL をキャッシュのプレフィックスとして使用します。したがって、キーは最終的に次のようになります。

localhost:3000/your/URL/cache_key

開発ログを見ると、使用するキーを確認できます。

また、アイテムをキャッシュから引き出すことは、ビューでキャッシュを呼び出すことで自動的に行われます。ページをロードすると、キャッシュ内のアイテムが有効かどうかを確認し、有効な場合はそれを取得し、そうでない場合は HTML を再生成してキャッシュに保存します。

また、キャッシュから読み取りたいだけの場合はRails.cache.readRails.cache.fetch通常、キーが有効な場合はキャッシュから取得し、有効でない場合は提供されたブロックでキャッシュに書き込みます。

その Rails.cache.read your_cache_keyため、そのキャッシュキーで保存されているものは何でも返すだけです(もしあれば)

フェッチは次のように使用されます。

Rails.cache.fetch your_cache_key do
  # Logic to generate items you want to cache
end

ビューでの呼び出し<% cache @object do %>は、基本的にはショートカットですRails.cache.fetch

キャッシュ呼び出しを次のように変更することをお勧めします。

<% cache ['home_main', @locations.order('updated_at DESC').first] do %>
    # your html here
<% end %>

この場合、キャッシュ キーは、最後に更新されたロケーション オブジェクトに基づいています。ロケーションが更新されると、次のリクエストでキャッシュが失われ、再生成されます。ここでキャッシュが行っているのはcache_key、最近更新されたロケーション オブジェクトを呼び出していることです。 cache_keyオブジェクトから updated_at タイムスタンプを取得し、キャッシュされたアイテムの保存に使用されるキーにそれを埋め込みます。

キャッシュに関する素晴らしいチュートリアルについては、http://www.broadcastingadam.com/2012/07/advanced_caching_part_1-caching_strategies/をご覧ください。また、時間ベースのキャッシュの有効期限やキャッシュ スイーパーを使用せずにキャッシュを自動期限切れにするための非常に優れたトリックも扱っています。

于 2012-09-16T14:28:50.257 に答える