sql >> データベース >  >> NoSQL >> Redis

Redisはどのようにして高いスループットとパフォーマンスを実現しますか?

    Redisのドキュメントには、その仕組みを理解するための豊富な情報があります。さて、具体的にあなたの質問に答えるために:

    1)接続はどのように維持されますか?

    接続は、aeイベントループ(Redis作成者によって設計された)を使用して維持および管理されます。すべてのネットワークI/O操作はノンブロッキングです。 aeは、libevent、libev、libuvなどのように、プラットフォームの最適なネットワークI / O逆多重化メカニズム(Linuxの場合はepoll、BSDの場合はkqueueなど)を使用した最小限の実装と見なすことができます...

    2)接続はTCPまたはHTTPですか?

    接続は、バイナリデータをサポートする単純なtelnet互換のテキスト指向プロトコルであるRedisプロトコルを使用するTCPです。このプロトコルは通常、HTTPよりも効率的です。

    3)メモリはどのように管理されていますか?

    メモリは、汎用メモリアロケータに依存して管理されます。一部のプラットフォームでは、これは実際にはシステムメモリアロケータです。他のいくつかのプラットフォーム(Linuxを含む)では、CPU消費、同時実行のサポート、断片化、およびメモリフットプリントのバランスが取れているため、jemallocが選択されています。 jemallocソースコードはRedisディストリビューションの一部です。

    他の製品(memcachedなど)とは異なり、Redisにはスラブアロケーターの実装はありません。

    メモリフットプリントを削減するために、多数の最適化されたデータ構造が汎用アロケータの上に実装されています。

    4)読み取り/書き込みが競合しているにもかかわらず、高スループットを実現するために使用される同期技術は何ですか?

    Redisはシングルスレッドのイベントループであるため、すべてのコマンドがシリアル化されるため、同期を行う必要はありません。現在、一部のスレッドは内部目的でバックグラウンドでも実行されます。まれに、メインスレッドによって管理されるデータにアクセスする場合、従来のpthread同期プリミティブが使用されます(たとえば、ミューテックス)。ただし、複数のクライアント接続のために行われるデータアクセスの100%は、同期を必要としません。

    詳細については、こちらをご覧ください。Redisはシングルスレッドですが、同時I / Oをどのように実行しますか?

    メモリキャッシュ内にあるマシンと、コマンドとRedisボックスに応答できるサーバーの単純なバニラ実装の違いは何ですか?

    違いはありません。 Redisは、コマンドに応答できるメモリキャッシュとサーバーを備えたマシンの単純なバニラ実装です。しかし、それは正しく行われる実装です:

    • シングルスレッドイベントループモデルの使用
    • 対応するユースケースに最適化されたシンプルで最小限のデータ構造を使用する
    • ミニマリズムと有用性のバランスをとるために慎重に選択された一連のコマンドを提供する
    • 常に最高の生のパフォーマンスをターゲットにする
    • 最新のOSメカニズムにうまく適合
    • 「1つのサイズですべてに対応」するため、複数の永続化メカニズムを提供することは夢にすぎません。
    • HAメカニズム(レプリケーションシステムなど)の構成要素を提供する
    • パンケーキのような役に立たない抽象化レイヤーの積み重ねを回避する
    • 優れたC開発者なら誰でも快適に使用できるクリーンで理解しやすいコードベースになります



    1. MapReduceのHadoopでのシャッフルと並べ替え

    2. 同じタスクが複数回実行された

    3. Redis Pub / Subで競合するコンシューマーはサポートされていますか?

    4. TrelloはMongoDBにデータをどのように保存しますか? (ボードごとのコレクション?)