私はRails 3アプリでシンプルなRails.cache
インターフェースで、redisとresqueを使用してバックグラウンドジョブ処理を行いたいと思います。
両方を使用するのに十分なほど異なると思います。ただし、herokuでは、memcachedとredisの両方を使用するための個別の料金があります。両方を使用するのは理にかなっていますか、またはredisを使用するだけに移行する必要がありますか?
キャッシュにmemcachedを使用するのが好きです。最も最近使用されていないキーが自動的にキャッシュからプッシュされ、キャッシュデータを保持する必要がないためです。 Redisは私にとってほとんど新しいものですが、デフォルトでは永続的であり、キーがキャッシュから自動的に期限切れにならないことを理解しています。
編集:ちょうど私の質問でより明確にしたかった。両方の代わりにRedisのみを使用することが実行可能であることを知っています。私はそうすることで特定の欠点があるかどうかを知りたいだけだと思いますか?実装とインフラストラクチャの両方を考慮すると、Redisを使用するだけではいけない理由はありますか? (つまり、単純なキャッシングの場合、memcachedの方が高速ですか?)どちらの方法でも決定的なものは見つかりませんでした。
既に行っているキャッシュのためにmemcachedからredisに移行するのは簡単だと仮定して、物事を単純にするためだけにredisを使用します。
Redisでは永続性はオプションであるため、必要に応じてmemcachedのように使用できます。キャッシュを永続化することは、再起動後に大量のキャッシュミスを回避するのに役立つことさえあります。有効期限も利用可能です-アルゴリズムはmemcachedとは少し異なりますが、ほとんどの目的には十分ではありません-詳細については http://redis.io/commands/expire を参照してください。
私は redis-store の作者です。Redisコマンドを直接使用する必要はありません。:expires_in
オプションは次のとおりです。
ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes
Redisを使用する利点は堅牢性です。私のgemでは、Rack::Cache
、Rails.cache
またはI18n
。
MemcachedとRedisの両方を使用するいくつかの大きなRailsサイトを見てきました。Memcachedは、メモリ内でホット状態を維持するのに便利ですが、必要に応じて失われたり再生成されたり両方とも、読み込み/書き込みの重い操作のためにメインDBの負荷を軽減するために使用されます。
詳細:
Memcached: page/fragment/responseキャッシングに使用され、古いものを期限切れにするためにLRU(最近使用されたものではない)でMemcachedのメモリ制限に達することは問題ありません。 。必要に応じて、MemcachedのすべてをDBから再作成できることが重要です(唯一のコピーではありません)。しかし、そこに物をダンプし続けることができ、Memcachedは最も頻繁に使用されるものを把握し、それらをメモリ内でホットに保ちます。 Memcachedからの削除について心配する必要はありません。
redis:失いたくないデータにこれを使用し、メモリに収まるほど小さい。これには通常、resque/sidekiqジョブ、レート制限用のカウンター、分割テスト結果、または失われたり再作成されたくないものが含まれます。ここでのメモリ制限を超えたくないので、保存して後でクリーンアップするものについてもう少し注意する必要があります。
Redisがメモリ制限を超えると、パフォーマンスの問題が発生し始めます(間違っている場合は修正してください)。 Memcachedのように動作するようにRedisを構成することでこれを解決でき、LRUが期限切れになるため、メモリ制限に達することはありません。ただし、Resqueジョブのように、Redisで保持しているすべてのものでこれを行いたくないでしょう。そのため、多くの場合、人々がデフォルトを維持する代わりに、Rails.cacheはMemcachedを使用するように設定します(dalli
gemを使用)。そして、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で簡単に行う方法があるかもしれません。おそらく、Memcacheに似たLRUハードメモリ制限のある2つのRedisインスタンスと、永続ストレージ用の別のRedisインスタンスを用意することでしょうか。私はこれが使われるのを見たことがありません、しかし、私はそれが実行可能であると推測しています。
このテーマに関する私の答えを確認することを検討します。
レールとキャッシング、memcacheとredisの切り替えは簡単ですか?
基本的に、私の経験を通して、私はそれらを別々に保つことを提唱します:キャッシュのためのmemcachedとデータ構造とより永続的なストレージのためのredis
Redis Labs ( Memcached Cloud および Redis Cloud adds)推奨する製品についてRailsキャッシュ。彼らは一般的に言ったMemcached Cloudは主にレガシー目的で提供されることをRedis Cloudに推奨し、Memcached Cloudサービスは実際にRedis Cloudの上に構築されることを指摘しました。
私はあなたがそれらを何に使用しているのかわかりませんが、実際に両方を使用するとパフォーマンスの利点が得られる場合があります:MemcachedはRedisよりも複数のコアで実行するパフォーマンスがはるかに優れているため、Memcachedで最も重要なデータをキャッシュし、残りをRedisに保持しますデータベースとしての機能を活用すると、パフォーマンスが向上する可能性があります。