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