1

私はこのアイデアを思いついたので、RedisやMySQLに精通している人に実行してもらいたいので、これを検討しても愚かだと言えます。

永続化されたオブジェクトを読み取り用にRedisに保存し、Redisキーが存在しない場合はデータベースデータにフォールバックすると、どのような影響があるのでしょうか。簡潔にするために、これが私が念頭に置いていることの(非常に)簡単な例です:

class ActiveRecord::Base
  def self.cache_or_query(id)
    Rails.cache.fetch("#{self.name}:#{id}") || begin
      record = self.find(id)
      Rails.cache.write("#{record.class}:#{record.id}", record)
      record
    end
  end
end

person = Person.create(name: "Tom Hanks", email: "thanks@gmail.com")
Person.cache_or_query(person.id) #=> query database, cache gets written, get Person object
Person.cache_or_query(person.id) #=> query Redis, get Person object

そして、CMSでは、レコードを保存すると、キャッシュが期限切れになるだけです(または、新しいデータで上書きされる可能性があります)。

だから、私の質問は次のとおりです。適切なサーバー条件が与えられた場合、RedisはMySQL(または任意のデータベース)よりも優れたパフォーマンスを発揮できますか?私の目標は、すべてのページで実行されるSQLクエリの数を減らすことです。私の希望は、データの取得がより高速であると信じているRedisに委任できることです。回答に関係なくベンチマークを行いますが、とにかく他の人の意見を聞きたいと思っています。さらに重要なことに、このセットアップは、本番環境のアクティブなWebサイトでは完全に失敗します。

私は確かにMySQLやRedisの内部の専門家ではないので、洞察に満ちた答えを得たいと思っています。

ありがとう!

更新ベンチマークの結果は、パフォーマンスの向上はごくわずかであるように思われることです。10,000クエリあたり1秒未満:https ://gist.github.com/3844026

その価値はありますか?

4

1 に答える 1

3

MySQLにはすでにワーキングセットがメモリにあります。また、フィルターなどを使用して複雑な選択を行う場合、Redisから何も得られません。単一のオブジェクトにredisを使用するだけです。

さらに、ActiveRecordはすでに既存のオブジェクトの関連付けをキャッシュしています...。

それは全く価値がありません。

于 2012-10-06T05:42:09.617 に答える