RedisがMemcachedよりも人気があるのはなぜですか?

著者:Kaitoリンク:kaito-kidd.com/2020/06/28/redis-vs-memcached/

序文

RedisとMemcachedはどちらもメモリデータベースであり、アクセス速度が非常に速いことは誰でも知っています。しかし、私たちの開発プロセスでは、これら2つのメモリデータベースからどのように選択するのでしょうか。それらの長所と短所は何ですか?

現在、RedisはMemcachedよりも人気があるのはなぜですか?

この記事では、これら2つのインメモリデータベースの違いをさまざまな側面から比較して、ビジネスニーズを最もよく満たすものを選択して使用できるようにします。

それらの違いを分析するには、主に次の側面を比較します。

  • スレッドモデル

  • データ構造

  • 除去戦略

  • パイプラインと業務

  • 持久化

  • 高可用性

  • クラスタリング

スレッドモデル

パフォーマンスについて話すには、サービスモデルを分析する必要があります。

Memcachedはリクエストを処理するためにマルチスレッドモデルを使用し、IO多重化テクノロジーに基づいています。メインスレッドがリクエストを受信すると、それは子スレッドに配信されて処理されます。

この利点は、リクエストの処理に時間がかかる場合でも、他のリクエストの処理に影響を与えないことです。

もちろん、デメリットは、CPUマルチスレッドの切り替えでパフォーマンスが低下することです。同時に、共有リソースにアクセスするときにマルチスレッドをロックする必要があるため、パフォーマンスがある程度低下します。

RedisはIO多重化テクノロジーも使用しますが、要求の受信から1つのスレッドでのデータの処理まで、要求の処理にシングルスレッドモデルを使用します。Redisはシングルスレッドですか、マルチスレッドですか?」を読むことをお勧めします。"

つまり、Redisでは、リクエストの処理に長い時間がかかると、リクエストが処理されて次のリクエストが処理される前に返されるまで、Redis全体がブロックされます。Redisを使用する場合は、複雑な時間のかかる操作を回避する必要があります。

シングルスレッドの利点は、CPUコンテキストの切り替えの消費が減ること、リソースへのマルチスレッドアクセスのロック競合がないことですが、欠点は、CPUマルチコアのパフォーマンスを使用できないことです。

Redisはインメモリデータベースであるため、アクセス速度が非常に速いため、パフォーマンスのボトルネックはCPUではなく、メモリとネットワークの帯域幅です。これが、著者がシングルスレッドモデルを採用する主な理由です。同時に、シングルスレッドはプログラム開発に非常に友好的であり、デバッグにも非常に便利です。マルチスレッドプログラムを開発すると、必然的にデバッグの難易度が高くなります。

したがって、ビジネスで比較的大きなキーデータを使用する場合、MemcachedのアクセスパフォーマンスはRedisよりも優れています。キーデータが比較的小さい場合、2つの間の差は大きくありません。

厳密に言うと、Redisのシングルスレッドとは、リクエストを処理するスレッドのことで、時間のかかるタスクを非同期的に処理するために他のスレッドが使用されているなど、他のスレッドが機能しています。

Redis 6.0は、マルチスレッドをさらに改善し、リクエストの受信およびリクエストの送信時にマルチスレッドを使用して、処理パフォーマンスをさらに改善しました。

データ構造

Memcachedは単一のデータ構造をサポートし、文字列型の操作のみをサポートします。また、値のサイズ制限は1MB未満である必要があり、有効期限は30日を超えることはできません。

Redisがサポートするデータ構造は非常に豊富で、一般的に使用されるデータ型の文字列、リスト、ハッシュ、セット、およびzsetに加えて、geoおよびhyperLogLogデータ型も使用できます。

Memcachedを使用する場合、データをシリアル化してMemcachedに書き込むことしかできません。次に、Memcachedからデータを読み取り、「すべてのストレージと検索全体」だけを必要な形式にデシリアライズします。

Redisは、さまざまなデータ構造に対してさまざまな操作方法を使用できるため、非常に柔軟です。

  • リスト:リンクリストを簡単に作成したり、キューとして使用したりできます

  • ハッシュ:「すべてのストレージとゼロアクセス」、「ゼロのストレージとすべてのアクセス」、「ゼロのストレージとゼロアクセス」を実行するために必要なフィールドを柔軟に操作します。

  • セット:繰り返されないセットを作成し、減算およびユニオン演算を簡単に実行します

  • zset:リーダーボード、または重み付きのリストを作成します

  • geo:2つの場所の座標を識別し、それらの距離を計算するためにマップ関連サービスに使用されます

  • hyperLogLog:UVを計算するために非常に少ないメモリを使用します

つまり、Redisは、豊富なデータ構造を提供し、ビジネス開発に非常に便利なため、近年インメモリデータベースの分野で大きな成果を上げています。データ型のより詳細な使用方法のチュートリアルについては、公開番号のJavaテクノロジースタックに注意してください。

除去戦略

Memcachedはインスタンス全体のメモリの上限を設定する必要があります。データが上限に達すると、LRU削除メカニズムがトリガーされ、一般的に使用されていないデータが最初に削除されます。

しかし、そのデータ消去メカニズムにはいくつかの問題があります。書き込まれたばかりのデータが最初に消去される可能性があります。この問題は、主に独自のメモリ管理設計メカニズムが原因です。

Redisには制限がありません。メモリの上限を設定する必要があります。メモリが十分に使用されている場合、Redisは十分なメモリを使用できます。「Redisメモリーがいっぱいになった場合の対処方法」読むことをお勧めします

同時に、Redisはさまざまな除去戦略を提供します。

  • Volatile-lru:LRUメカニズムに従って期限切れのキーを削除します

  • allkeys-lru:LRUメカニズムに従ってすべてのキーを削除します

  • volatile-random:期限切れのキーからランダムにキーを削除します

  • allkeys-random:すべてのキーからランダムにキーを削除します

  • volatile-ttl:最近期限切れになるキーの削除を優先します

  • volatile-lfu:LFUメカニズムに従ってすべてのキーを削除します

  • allkeys-lfu:LFUメカニズムに従って期限切れのキーを削除します

ビジネスシナリオには、さまざまなデータ消去戦略を使用できます。

パイプラインと業務

Redisはパイプライン機能もサポートしており、クライアントは1つのパッケージで複数のコマンドをサーバーに送信し、サーバーはクライアントから送信されたコマンドを順番に処理します。これにより、行き来するネットワークIOの数を減らし、高いアクセスパフォーマンスを提供できます。

また、トランザクションもサポートしていますが、ここで説明するトランザクションは、MySQLのようなRedis固有の厳密なトランザクションモデルではありません。

一般的なトランザクションはパイプラインと組み合わせて使用​​されます。クライアントは複数のコマンドを1つのパッケージでサーバーに送信し、これらのコマンドは厳密な順序で実行する必要があり、他のクライアントによって中断できないことを識別します。トランザクションを同時に実行する前に、クライアントはサーバーにキーが後で関連する操作を実行することを通知できます。クライアントがキーを操作する前にキーを変更した場合、現在のクライアントはこれらのコマンドを実行しています一貫性を確保するためにトランザクション操作全体をあきらめます。

持久化

Memcachedはデータの永続性をサポートしていません。Memcachedサービスがダウンすると、このノードのすべてのデータが失われます。

Redisはディスク上のデータの永続化をサポートし、RDBとAOFの2つの方法を提供します。

  • RDB:インスタンス全体のデータをディスクにスナップショットし、完全に永続化します

  • AOF:すべての書き込みコマンドをディスクに永続化し、段階的に永続化します

Redisはこれら2つの方法を使用して互いに連携し、データの整合性保護を完了し、サービスのダウンタイムによるデータの損失を最小限に抑えます。

高可用性

Memcachedにはマスタースレーブレプリケーションアーキテクチャがなく、単一のノードにのみデプロイできます。ノードがダウンすると、そのノードのすべてのデータが失われます。ビジネスはこの状況に対応している必要があります。ノードが使用できない場合、データは他のノードに書き込まれ、ビジネスへの影響を軽減します。

Redisにはマスター/スレーブレプリケーションアーキテクチャがあります。2つのノードがマスター/スレーブアーキテクチャを形成します。スレーブはマスターのデータをリアルタイムで同期し、Redisサービス全体の可用性を向上させることができます。

同時に、Redisはセンチネルノードも提供し、マスターノードがダウンすると、スレーブノードはアクティブにマスターノードに昇格し、サービスを提供し続けます。Redis SentryをSpring Bootおよび他の一連のチュートリアルと統合する方法については、パブリックアカウントのJavaテクノロジスタック検索を参照してください。

マスターとスレーブの2つのノードは、プログラムアクセスのパフォーマンスをさらに改善するために、読み取り/書き込み分離機能を提供することもできます。

クラスタリング

MemcachedとRedisはどちらも、外部サービスを提供するクラスターを形成する複数のノードで構成されていますが、それらのメカニズムも異なります。

Memcachedのクラスタリングでは、一貫したハッシュアルゴリズムを使用して、クライアント側の指定されたノードにデータを送信します。ノードがダウンすると、他のノードがこのノードのリクエストを共有します。

Redisクラスタリングでは、各ノードが仮想スロットの一部を維持し、キーのハッシュ計算により、キーが特定の仮想スロットにマッピングされ、このスロットが特定のRedisノードにマッピングされます。

同時に、各Redisノードには少なくとも1つのスレーブノードが含まれてマスタースレーブアーキテクチャを形成し、各ノードの高可用性機能をさらに向上させます。

ノードを追加またはオフラインにするときは、データの移行を手動でトリガーし、ハッシュスロットを再マッピングする必要があります。

公式のRedisクラスタリングソリューションは、分散型設計を使用するRedisクラスターです。さらに、CodisやTwemproxyなど、一元化された設計プロキシ方式を使用するサードパーティのクラスタリングソリューションもあります。

総括する

上記の側面からの比較分析を次の表にまとめます。

全体として、Redisは非常に豊富な機能を提供し、パフォーマンスは基本的にMemcachedと同じです。そのため、近年メモリデータベースで主導権を握っています。

ビジネスでさまざまなデータ構造からのサポートが必要であり、データの高可用性が必要な場合は、Redisがより適切です。

ビジネスが非常に単純で、単純な設定/取得であり、メモリ使用量が多くない場合は、単純なMemcachedで十分です。

この記事によって作業効率が少し向上する場合は、それを読んで転送し、より良い記事を書くように促してください。

最近のおすすめの最新記事:

1. IntelliJ IDEAアクティベーションコードを無料で入手する6つの方法!

2. Java 8を使用してロジックを記述しましたが、同僚はそれを直接理解できませんでした。

3. Sling Tomcat、Undertowのパフォーマンスは非常に爆発的です!

4. 中国人は非常に使いやすい非常に使いやすいRedisクライアントをオープンソース化しました!

5. 「Java開発マニュアル(Songshan Edition)」の最新リリース、すぐにダウンロード!

気分が良いです。+転送することを忘れないでください。

気分がいいです。いいね+進むを忘れないでください!

最後に、スタックリーダーのWeChat公式アカウントに注意してください。Javaテクノロジースタック、返信:福祉、2020年に向けて私がまとめた最新のJavaインタビューの質問の無料コピーを入手できます。これは、ルーチンなしで本当に完全です(回答を含む)。

おすすめ

転載: blog.csdn.net/youanyyou/article/details/108526701