14

アプリでのデータベース トランザクションに時間がかかるようになっているため、memcached を使用して MySQL に渡されるクエリの量を減らし始めました。

全体として、うまく機能し、多くの時間を節約できます。

しかし、キャッシングはアプリをさらに活用するための回避策として「静かに現れた」ため、多くのモデルには次のようなコードが含まれるようになりました。

def self.all_cached

  Rails.cache.fetch('object_name') {

    find(

      :all,
      :include => [associations])

    }

end

アプリケーション全体のいくつかのクラスでキャッシュのフィルとフラッシュが発生するため、これはますます苦痛になっています。

さて、memcached ロジックを抽象化して、必要なすべてのモデルでより強力で使いやすくするためのより良い方法があるかどうか疑問に思っていました。

必要なすべてのモジュールに含まれるある種の memcached-module を持つことを考えていました。

しかし、いじる前に、まず専門家に聞いてみましょう :-)

ありがとう

マット

4

2 に答える 2

13

既存のプラグインを確認することをお勧めします。2 つの大きなプラグインはcache_fucache moneyです。キャッシュから関連付けを使用してモデルをロードするユースケースでは、ほぼ自動的に実行される Cache Money を試すことを強くお勧めします。

def parent < ActiveRecord::Base
  has_many children
end

def child < ActiveRecord::Base
  index :parent_id
end

#now you can do the following without ever hitting the DB
parents = Parent.find :all
parents.each{ |p| p.children }

Cache Money の本当に大きなメリットは、データベース レプリケーションの遅延が問題になるところまでスケールアップしたときに、ライト スルー キャッシュが問題を解決してくれることです。これは、レプリケーションの遅延が原因で 500 エラーが発生しやすく、通常は望ましくない悪夢となる Rails では特に重要です。

于 2009-05-12T16:55:08.063 に答える
5

はい、必要なすべてのモデルにmemcachedモジュールを含めることが、最善の解決策だと思います。あなたの考え方は素晴らしいです:)

于 2009-05-09T10:32:22.700 に答える