今日、Redisを介したmemcachedのユースケースとして私が見ている主な理由は、プレーンHTMLフラグメントキャッシング(または同様のアプリケーション)で得られるはずの優れたメモリ効率です。オブジェクトのさまざまなフィールドをさまざまなmemcachedキーに格納する必要がある場合、Redisハッシュはメモリ効率が高くなりますが、キー-> simple_stringのペアが多数ある場合、memcachedはより多くのアイテムを提供できるはずです。メガバイト。
memcachedの良い点であるその他のこと:
- これは非常に単純なコードなので、提供する機能だけが必要な場合は、合理的な代替手段だと思いますが、本番環境では使用していません。
- これはマルチスレッドであるため、シングルボックスのセットアップでスケーリングする必要がある場合、それは良いことであり、1つのインスタンスとだけ話す必要があります。
キャッシュとしてのRedisは、人々がインテリジェントキャッシュに移行するとき、またはRedisデータ構造を介してキャッシュされたデータの構造を保持しようとするときに、ますます理にかなっていると思います。
RedisLRUとmemcachedLRUの比較。
memcachedとRedisはどちらも、実際のLRUエビクションを実行しませんが、その近似値のみを実行します。
Memcacheエビクションはサイズごとのクラスであり、スラブアロケーターの実装の詳細に依存します。たとえば、特定のサイズクラスに適合するアイテムを追加する場合、memcachedは、そのクラスの期限切れ/最近使用されていないアイテムを削除しようとします。代わりに、オブジェクトに関係なく、オブジェクトが何であるかをグローバルに理解しようとします。サイズ、これが最適な候補です。
代わりに、Redismaxmemory
は、制限に達したときに、サイズクラスに関係なく、すべてのオブジェクトを調べて、エビクションの候補として適切なオブジェクトを選択しようとしますが、アイドル状態が大きい最良のオブジェクトではなく、ほぼ適切なオブジェクトのみを提供できます。時間。
Redisがこれを行う方法は、いくつかのオブジェクトをサンプリングし、最も長い時間アイドル状態(アクセスされていない)のオブジェクトを選択することです。Redis 3.0(現在ベータ版)以降、アルゴリズムが改善され、エビクション全体で適切な候補プールが取得されるため、近似が改善されました。でRedisのドキュメントあなたはそれがどのように機能するかについての詳細を説明し、グラフを見つけることができます。
単純な文字列->文字列マップの場合、memcachedのメモリフットプリントがRedisよりも優れている理由。
Redisはより複雑なソフトウェアであるため、Redisの値は、高水準プログラミング言語のオブジェクトに似た方法で保存されます。メモリ管理のために、タイプ、エンコーディング、参照カウントが関連付けられています。これにより、Redisの内部構造は適切で管理しやすくなりますが、文字列のみを処理するmemcachedと比較してオーバーヘッドがあります。
Redisのメモリ効率が向上し始めたとき
Redisは、特別なメモリ節約方法で小さな集計データ型を保存できます。たとえば、オブジェクトを表す小さなRedisハッシュは、ハッシュテーブルではなく、バイナリの一意のblobとして内部に格納されます。したがって、オブジェクトごとに複数のフィールドをハッシュに設定する方が、N個の分離されたキーをmemcachedに格納するよりも効率的です。
実際には、オブジェクトを単一のJSON(またはバイナリエンコード)blobとしてmemcachedに格納できますが、Redisとは異なり、これでは独立したフィールドをフェッチまたは更新できません。
インテリジェントキャッシングのコンテキストにおけるRedisの利点。
Redisデータ構造のため、キャッシュが無効になったときにオブジェクトを破棄するmemcachedで使用される通常のパターンは、後でDBから再作成するために、Redisを使用する基本的な方法です。
たとえば、サイトの「最新」セクションにデータを入力するために、HackerNewsに投稿された最新のNニュースをキャッシュする必要があるとします。Redisで行うことは、最新のニュースが挿入されたリスト(Mアイテムに制限されている)を取得することです。データに別のストアを使用し、Redisをキャッシュとして使用する場合は、新しいアイテムが投稿されたときに両方のビュー(RedisとDB)にデータを入力します。キャッシュの無効化はありません。
ただし、アプリケーションには常にロジックを含めることができるため、たとえば起動後にRedisリストが空であることが判明した場合、DBから初期ビューを再作成できます。
インテリジェントキャッシュを使用することで、memcachedと比較してより効率的な方法でRedisを使用してキャッシュを実行できますが、すべての問題がこのパターンに適しているわけではありません。たとえば、HTMLフラグメントのキャッシュは、この手法の恩恵を受けない場合があります。