RedisとMemcacheまたは単にRedis?


85

シンプルなRails.cacheインターフェイスを介してRails3アプリのキャッシュにmemcachedを使用していますが、redisとresqueを使用してバックグラウンドジョブ処理を実行したいと思います。

両方を使用するのに十分な違いがあると思います。ただし、herokuでは、memcachedとredisの両方を使用するための個別の料金があります。両方を使用するのは理にかなっていますか、それとも単にredisを使用するように移行する必要がありますか?

キャッシュにmemcachedを使用するのが好きです。これは、最近使用されていないキーが自動的にキャッシュからプッシュされ、キャッシュデータを永続化する必要がないためです。Redisは私にとってほとんど新しいものですが、デフォルトでは永続的であり、キーがキャッシュから自動的に期限切れにならないことを理解しています。

編集:私の質問をもっと明確にしたかっただけです。両方ではなくRedisのみを使用することが可能であることを私は知っています。そうすることで特定の不利な点があるかどうかを知りたいだけだと思いますか?実装とインフラストラクチャの両方を考慮すると、Redisだけを使用すべきではない理由はありますか?(つまり、単純なキャッシュの場合、memcachedの方が高速ですか?)どちらの方法でも決定的なものは見つかりませんでした。


5
これを検討している他の人のために:redisをキャッシュストアとして使用できるようにするrails用のredis-storeプラグインがあります。
markquezada 2010年

回答:


49

すでに行っているキャッシュのためにmemcachedからredisに移行するのは簡単だとすると、単純にするためだけにredisを使用します。

redisでは、永続性はオプションであるため、必要に応じてmemcachedのように使用できます。キャッシュを永続化することは、再起動後の多くのキャッシュミスを回避するのに役立つ場合もあります。有効期限も利用できます-アルゴリズムはmemcachedとは少し異なりますが、ほとんどの目的にとって重要ではありません-詳細については、http://redis.io/commands/expireを参照してください。


1
回答と関連ドキュメントをありがとう。質問を少し編集して、探しているものをより明確にしました。再起動後のキャッシュの永続性については考えていませんでした...これは素晴らしい機能です。(redisを使用してherokuを使用することを検討すると、どれほど役立つかはわかりませんが。)
markquezada 2010年

1
一部のアイテムを一時的(フラグメントキャッシング)に保ち、一部のアイテムをredisに永続的に保持する場合、2つの別々のredisインスタンスを作成する必要がありますか?
ブライアンアームストロング

1
ジョブキューとキャッシュの両方にRedisを使用していますが、特に@BrianArmstrongが述べている理由により、異なる構成でそれらを実行しています。キャッシュは一時的なものであるため、高速で構成しますが、メモリ内のデータを失ってLRUを削除しても問題ありません。キューについては、ジョブを失いたくないので、回復可能になるように永続的に構成します。
jwadsa​​ck 2014

@jwadsa​​ckこの構成をどのように実装したかを示す投稿はありますか?
マークラー2015

1
@Marklarいい考えです。私は今します:ballardhack.wordpress.com/2015/09/30/…– jwadsa​​ck 2015
19:12

44

私はredis-store作成者です。直接Redisコマンドを使用する必要はありません:expires_in。次のようなオプションを使用するだけです。

ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes

Redisのを使用する利点は、堅牢で、そして私の宝石で、あなたはすでにのために店舗を持っているということであるRack::CacheRails.cacheまたはI18n


応答ルカをありがとう。何かを永続的に保存する必要がある場合は、:expires_inを直接オーバーライドできると思いますか?問題は、memcachedタイプの機能使用すること、redisを永続ストアとして使用することの両方に関するものだと思います。
markquezada 2011年

3
memcachedとredisの両方を一緒に使用することは意味がないと思います。これらは同じNoSQLセグメントにあり、どちらもak / vストアであるためです。Redisの長所:1。memcachedよりも高速2.より強力なコマンド3.キャッシュのウォームアップは不要4.他の問題(Resqueのキューなど)の解決に役立つ短所:1。外部gemが必要2.再起動後、サーバー追加ファイルからデータを読み取るときにコマンドを受け入れないMemcached長所:Railsでベイク短所:1。Redisより遅い2.キャッシュのウォームアップ。
Luca Guidi 2011年

3
@LucaGuidi現在、RailsキャッシュにRedisStoreを使用しています。RedisURLデフォルトの両方を設定する方法がわかりません:expires_in。手伝ってくれますか?
クリスビンセント

私のように、:expires_inredis_storeを使用した問題設定に直面している場合は stackoverflow.com
questions / 20907247…

19

MemcachedとRedisの両方を使用するいくつかの大きなレールサイトを見てきました。Memcachedは、メモリ内でホットに保つのに適しているが、必要に応じて失われたり再生成されたりする可能性のある一時的なものに使用され、Redisは永続的なストレージに使用されます。どちらも、読み取り/書き込みの重い操作のためにメインDBから負荷を取り除くために使用されます。

詳細:

Memcached:ページ/フラグメント/応答のキャッシュに使用されます。Memcachedのメモリ制限に達しても問題ありません。LRU(最近使用されていない)が古いものを期限切れにし、アクセスされたキーをメモリ内で頻繁にホットに保つためです。必要に応じて、Memcached内のすべてのものをDBから再作成できることが重要です(これが唯一のコピーではありません)。しかし、物事をそこにダンプし続けることができ、Memcachedは最も頻繁に使用されるものを特定し、それらをメモリ内でホットに保ちます。Memcachedから物を削除することを心配する必要はありません。

redis:これは、失いたくないデータに使用し、メモリに収まるほど小さいものです。これには通常、resque / sidekiqジョブ、レート制限用のカウンター、分割テスト結果、または失いたくない/再作成したくないものが含まれます。ここでメモリ制限を超えたくないので、保存して後でクリーンアップするものについてもう少し注意する必要があります。

Redisは、メモリ制限を超えるとパフォーマンスの問題が発生し始めます(間違っている場合は修正してください)。MemcachedおよびLRUの期限切れのもののように動作するようにRedisを構成することでこれを解決できるため、メモリ制限に達することはありません。ただし、resqueジョブのように、Redisに保持しているすべてのものでこれを実行することは望ましくありません。そのため、多くの場合、デフォルトを維持する代わりに、Rails.cacheは(dalligemを使用して)Memcachedを使用するように設定されています。そして、redis操作を行うために個別の$ redis = ...グローバル変数を保持します。

# in config/application.rb
config.cache_store = :dalli_store  # memcached

# in config/initializers/redis.rb
$redis = $redis = Redis.connect(url: ENV['REDIS_URL'])

これをすべてRedisで行う簡単な方法があるかもしれません-おそらく2つの別々のRedisインスタンスを用意することで、1つはMemcacheと同様にLRUハードメモリ制限があり、もう1つは永続ストレージ用ですか?私はこれが使われているのを見たことがありませんが、それは実行可能だと思います。


15

私はこの主題に関する私の答えをチェックすることを検討します:

Railsとキャッシング、memcacheとredisを簡単に切り替えることができますか?

基本的に、私の経験を通して、私はそれらを別々に保つことを提唱します:キャッシュ用のmemcachedとデータ構造とより永続的なストレージ用のredis


当初は質問に対する当初の回答に基づいて統合する予定でしたが、その後は基本的に同じ結論に達しました。基本的なキャッシュにはmemcacheを使用し、resqueにはredisを使用しています。
markquezada 2010

6

私は、Redis LabsMemcachedCloudおよびRedisCloudアドオンを提供している)のチームに、Railsキャッシングに推奨する製品について尋ねました。彼らは、一般的にRedis Cloudを推奨し、Memcached Cloudは主にレガシー目的で提供されると述べ、MemcachedCloudサービスは実際にはRedisCloud上に構築されていると指摘しました。


では、Brianの回答で述べたように、memcachedとredisの両方は必要ありませんか?「多くの場合、デフォルトのRails.cacheを(dalli gemを使用して)memcachedを使用するように設定したままにします。次に、redis操作を実行するために別の$ redis = ...グローバル変数を保持します。」
マークラー2014年

4

何に使用しているのかわかりませんが、実際に両方を使用すると、パフォーマンスが向上する可能性があります。Memcachedは、Redisよりも複数のコアで実行するパフォーマンスがはるかに優れているため、最も重要なデータをMemcachedでキャッシュし、残りをRedisに保持します。 、データベースとしての機能を利用すると、パフォーマンスが向上する可能性があります。


1
これは完全には真実ではありません。redisは複数のスレッドではなく複数のインスタンスを使用するため、シングルコアのredisインスタンスをマルチコアのmemcachedインスタンスと比較することは特に関連性の高いテストではありません。さらに、両方のシステムが最速であることを示すベンチマークが利用可能な場合、現実の世界では違いが問題になる可能性はほとんどありません。
トムクラークソン

redisのマルチプロセスアプローチは、マルチスレッドを使用したmemcachedの(デフォルトの)アプローチよりもマルチコアシステムでのスケーリングが優れています:antirez.com/post/update-on-memcached-redis-benchmark.html
Ludger Sprenker 2010年

3
Redisのこの大きな欠点は、実際にはかなり軽視されています。高い同時実行性を探していて、多くのコアがある場合、MemcachedはRedisの周りでサークルを実行できます。アプリケーションにコンシステントハッシュを実装する必要があり、Redisインスタンス間で完全な分散が得られないため、シャーディングは適切なソリューションではありません。たとえば、シャードAがすべてのリクエストで使用されるアプリケーションの構成をキャッシュする場合、シャードAは、すべてのリクエストでヒットしない他のシャードよりも多くのリクエストを取得します。
ColinM 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.