6
select * from Foo where id = 200

特定のIDで常にselect呼び出しが行われているのを観察するため、idでオブジェクトの検索をキャッシュする方法。将来的に任意のキャッシュストア(memcachedまたはredisなど)を切り替えることができるように、目立たない方法でレールでこれを有効にするにはどうすればよいですか?

編集:

org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITEJavaEEのすべてのエンティティクラスに適用されるHibernateベースのキャッシング戦略とよく似て います。

4

4 に答える 4

3

あなたのFooモデルでは、おそらくこのようなものが必要です

class Foo < ActiveRecord::Base

  def self.find_some_foo(foo_id)
    Rails.cache.fetch("foo_#{foo_id}", expires_in: 7.days) do
      begin
        self.where(:id => foo_id)
      rescue Exception => e
        logger.info "Exception fetching Foo ID: #{e.to_s}"
        nil
      end
    end
  end

end

config.cache_store=ファイル内を呼び出して、アプリケーションのデフォルトのキャッシュストアを設定します。たとえばconfig/application.rb、Alex Ghiculescuが提供するリンクには、セクション2.1に適切な情報がありますconfig.cache_store = :memory_store

cache_storeに存在しないキーをフェッチしようとすると、railsキャッシュストアに自動的にデータが入力されます。このため、キーの適切な命名規則を考え出すことが重要です。基本を確立したら、で適切な変更を加えることで、さまざまなキャッシュストアを簡単に切り替えることができconfig/application.rbます。選択肢には、メモリストアファイルストアmemcache、またはキャッシュストアの任意の組み合わせがあります。

Railsのメモリ内キャッシュをフラッシュするには、Railsサーバーを再起動します。ファイルキャッシュをフラッシュするには、と入力しrake tmp:clearます。memcacheをフラッシュするには、このリンクを参照してください。

于 2013-03-28T18:41:32.910 に答える
2

Railsの組み込みキャッシュを簡単に使用できます

Rails.cache.fetch :cache_id_here, :expires_in => 1.days do
   Model.find(id)
end

好きなように変更:cache_id_hereし、有効期限を好みに合わせて設定します。このキャッシュは、memcachedまたは任意の代替キャッシュストアで使用できます。これは、アプリケーション構成で設定するだけです。

アップデート

Railの.findメソッドと.saveメソッドを拡張し、結果をキャッシュすることで、この問題を解決するgemに取り組んでいます。これはスーパーベータ版であり、まだ本番環境でテストされていませんが、試してみたい場合は、レポジトリをご覧ください: https ://github.com/johnkoht/cache-money-millionaire考え。

基本的に、電話をかけるPost.find(3)と、キャッシュされたバージョンが自動的に検出されて作成され、そのキャッシュキーはPost 3保存またはタッチ時に自動的に更新されます。私が言ったように、それはベータ版ですが、それは問題を解決します。

于 2013-03-26T15:53:01.397 に答える
1

次のgemは、ライトスルーキャッシュ機能を提供します。

レコードキャッシュ

Rails3をサポートします。活発に開発されています。

cache_money

Twitterによって構築され、現在はコミュニティによって管理されています。Rails3をサポートしているかどうかはわかりません。

于 2013-03-24T17:12:54.527 に答える
0

IDマップが役立つ可能性があります:http://api.rubyonrails.org/classes/ActiveRecord/IdentityMap.html

まだベータ版なので、注意して使用してください。また、関連付けを追跡しません。

于 2013-03-31T08:54:03.870 に答える