Redisがシングルスレッドである理由とRedisが非常に高速である理由!



Why Is Redis Single Threaded



まず、Redisの紹介

Redisは、データベース、キャッシュ、メッセージングミドルウェアとして使用できるオープンソースのインメモリデータ構造ストレージシステムです。

文字列、ハッシュ、リスト、セット、順序付きセット(ソート済みセットまたはZSet)、範囲クエリ、ビットマップ、ハイパーログログ、地理空間インデックス半径クエリなど、複数のタイプのデータ構造をサポートします。一般的なデータ構造タイプは、String、List、Set、Hash、およびZSetです。



Redisには、レプリケーション、LUAスクリプト、LRUドライバーイベント(LRU)が組み込まれています。
エビクション)、トランザクション(トランザクション)、さまざまなレベルのディスク永続性(永続性)、および
Redisセンチネル(センチネル)と自動パーティション(クラスター)は、高可用性(高可用性)を提供します。

Redisは、ユーザーが自分のデータをディスクに保存して保存できるようにする永続性のオプションも提供します。実際の状況に応じて、データセットを定期的にディスクにエクスポート(スナップショット)するか、コマンドログに追加することができ(AOFはファイルを追加するだけです)、実行時に実行された書き込みコマンドをハードディスクにコピーします書き込みコマンド。 。永続性をオフにして、Redisを効率的なネットワークのキャッシュデータ機能として使用することもできます。



Redisはテーブルを使用せず、彼のデータベースは、Redisに保存されているさまざまなデータをユーザーに事前定義または関連付けるように強制しません。

データベースの動作モードは、ストレージモードに応じてハードディスクデータベースとインメモリデータベースに分けることができます。 Redisはデータをメモリに保存し、ハードディスクI / Oの速度に制限されることなくデータの読み取りと書き込みを行うため、非常に高速です。
(1)ハードディスクデータベースの動作モード:
画像
(2)インメモリデータベースの動作モード:
画像

上記の説明を読んだ後、次のような一般的なRedis関連の面接の質問を知っていますか?Redis、Redisの一般的なデータ構造タイプは何ですか、Redisはどのように永続的ですか。



次に、Redisの速度はどれくらいですか?

Redisは、Cで記述されたシングルプロセスのシングルスレッドモデルを備えたメモリベースのKVデータベースを使用します。公式データは100,000以上のQPS(1秒あたりのクエリカウント)です。このデータは、シングルプロセスマルチスレッドでMemcachedされた同じメモリベースのKVデータベースよりも悪くはありません。興味がある場合は、公式ベンチマークプログラムを参照して、「Redisの速度はどれくらいですか?」をテストできます。 》 https://redis.io/topics/benchmarks)
画像

ここに写真の説明を書いてください
横軸は接続数、縦軸はQPSです。この時点で、この図は桁違いに反映されています。インタビューの中で、皆さんが正しく説明してくれることを願っています。あなたがそれを求めないとき、あなたの答えの大きさの順序は非常に異なります!

第三に、Redisがこんなに速いのはなぜですか?

1、完全にメモリに基づいており、ほとんどの要求は純粋なメモリ操作であり、非常に高速です。データは、HashMapと同様にメモリに存在します。 HashMapの利点は、ルックアップと操作の時間計算量がO(1)であることです。

2、データ構造がシンプルで、データ操作もシンプルで、Redisのデータ構造は特別に設計されています

3、シングルスレッドを使用して、不必要なコンテキストスイッチングと競合条件を回避するために、CPUの消費によって引き起こされるマルチプロセスまたはマルチスレッドスイッチングがなく、さまざまなロックを考慮する必要がなく、ロック解除ロック操作がありません、デッドロックの可能性によるパフォーマンスの消費なし

4.マルチチャネルI / O多重化モデル、ノンブロッキングIOを使用します

5、基盤となるモデルの使用が異なり、それらとクライアントと通信するためのアプリケーションプロトコルとの間の基盤となる実装が異なり、RedisはVMメカニズムを直接構築します。これは、一般的なシステムがシステム関数を呼び出すため、一定の時間を浪費するためです。移動してリクエストする

上記の点はよりよく理解されています。以下では、マルチチャネルI / O多重化モデルについて簡単に説明します。
(1)マルチI / O多重化モデル
マルチI / O多重化モデルは、select、poll、およびepollを使用して、複数のストリームのI / Oイベントを同時に監視する機能です。
アイドル状態の場合、現在のスレッドはブロックされます。 1つ以上のストリームにI / Oイベントがある場合、それらはブロッキング状態からウェイクアップするため、プログラムは常にポーリングします。ストリーム(epollは実際にイベントを送信したストリームのみをポーリングします)、および準備ができたストリームのみを順番に処理するため、多くの無駄な操作が回避されます。

ここで、「多重化」は複数のネットワーク接続を指し、「多重化」は同じスレッドを多重化することを指します。マルチチャネルI / O多重化
このテクノロジーにより、単一のスレッドで複数の接続要求を効率的に処理でき(ネットワークIOに費やされる時間を最小限に抑える)、Redisはメモリ内のデータを非常に高速に操作します。つまり、データはメモリ内にあります。操作がRedisのパフォーマンスに影響を与えるボトルネックになることはありません。上記の点により、Redisのスループットは高くなっています。

第4に、Redisがシングルスレッドであるのはなぜですか?

上記のすべての分析は、Redisの迅速な雰囲気を作り出すことであることを最初に理解する必要があります。公式FAQによると、Redisはメモリベースの操作であるため、CPUはRedisのボトルネックではありません。 Redisのボトルネックは、マシンのメモリまたはネットワーク帯域幅のサイズである可能性があります。シングルスレッドは実装が簡単で、CPUがボトルネックにならないため、シングルスレッドソリューションを採用するのが論理的です(結局、複数のスレッドを使用すると多くの問題が発生します!)。
画像
参照できます: https://redis.io/topics/faq

これを見て、あなたは泣いているかもしれません! Redisがシングルスレッドを使用して非常に高速になるようにするための主要な技術的ポイントがあると思いました。私はそれが私たちをだましているように見える公式であるとは思っていませんでした!ただし、Redisが非常に高速である理由はすでに明確に説明できます。また、シングルスレッドモードの場合はすでに非常に高速であるため、マルチスレッドを使用する必要はありません。

ただし、シングルスレッドアプローチでマルチコアCPUパフォーマンスを使用することはできませんが、単一のマシンで複数のRedisインスタンスを開くことで使用できます。

警告1:ここでは、単一スレッドを強調してきました。ネットワークリクエストを処理する場合にのみ、処理するスレッドは1つだけです。正式なRedisサーバーは、実行時に複数のスレッドである必要があります。ここでは注意が必要です。たとえば、Redisが永続化されると、子プロセスまたは子スレッドとして実行されます(具体的には、子スレッドまたは子プロセスはリーダーによってさらに調査されます)。たとえば、テストサーバーでRedisプロセスを表示します。次に、プロセスの下にあるスレッドを見つけます。
画像
psコマンドの「-T」パラメーターは、スレッドの表示を示します(スレッドを表示し、場合によってはSPID列を使用します)。「SID」列はスレッドIDを示し、「CMD」列はスレッド名を示します。

警告2:上記のFAQの最後の段落では、Redis 4.0からマルチスレッドをサポートする方法が説明されていますが、一部の操作ではマルチスレッド操作のみが実行されます。したがって、記事が将来のバージョンでまだシングルスレッドであるかどうかは、読者が調査する必要があります!

五、注意を払う

1.Redisが「シングルスレッド多重化IOモデル」を使用して高性能のインメモリデータサービスを実装していることはわかっています。このメカニズムはロックの使用を回避しますが、同時に、sunionの実行にはより時間がかかります。この順序により、redisの同時実行性が低下します。シングルスレッドであるため、一度に進行中の操作は1つだけです。そのため、時間のかかるコマンドは、読み取りの同時実行性だけでなく、書き込みの同時実行性も低下するだけでなく、同時に低下する可能性があります。 1つのスレッドで使用できるCPUコアは1つだけなので、同じマルチコアサーバーで複数のインスタンスを起動して、マスターマスターまたはマスタースレーブフォームを形成できます。時間のかかる読み取りコマンドは、完全にスレーブで実行できます。

redis.confアイテムを変更する必要があります:
pidfile /var/run/redis/redis_6377.pid#pidfileでポート番号を追加します
ポート6377#これは変更する必要があります
logfile /var/log/redis/redis_6377.log#logfile名とポート番号
dbfilename dump_6377.rdb#rdbfileとポート番号

2. '独自のプログラムをよく知っているため、オペレーティングシステムの負荷分散を行うことはできません。そのため、CPUを過剰に使用しないように、手動でCPUコアを割り当てることができます。または、重要なプロセスと1つのプロセスを使用できます。スタッキングは混雑しています。
CPUは重要な要素です。シングルスレッドモデルであるため、Redisはマルチコアではなく大容量キャッシュの高速CPUを好みます。

マルチコアCPUサーバーでは、RedisのパフォーマンスはNUMA構成とプロセッサーバインディングの場所にも依存します。最も明白な効果は、redis-benchmarkがCPUコアをランダムに使用することです。正確な結果を得るには、固定プロセッサツールを使用する必要があります(Linuxではタスクセットを使用できます)。最も効果的な方法は、クライアントとサーバーを2つの異なるCPUに分離して、大学で第3レベルのキャッシュを使用することです。

第六に、拡張

ここにあなたが知っておくべきいくつかのモデルがあります、そして私はあなたにインタビューを望みます!

1、シングルプロセスマルチスレッドモデル:MySQL、Memcached、Oracle(Windowsバージョン)

2、マルチプロセスモデル:Oracle(Linuxバージョン)

3、Nginxには2種類のプロセスがあります。1つはマスタープロセス(管理プロセスに相当)と呼ばれ、もう1つはワーカープロセス(実際の作業プロセス)と呼ばれます。開始するには2つの方法があります。

(1)単一プロセスの起動:現時点では、システムには1つのプロセスしかなく、マスタープロセスの役割とワーカープロセスの役割の両方として機能します。

(2)マルチプロセスの起動:現時点では、システムにはマスタープロセスが1つだけあり、少なくとも1つのワーカープロセスが機能します。

(3)マスタープロセスは、主にいくつかのグローバル初期化作業を実行し、ワーカーで実行されるワーカーイベント処理の作業を管理します。
画像
参考記事:
1、 http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.html
二、 http://blog.csdn.net/xxb2008/article/details/42238557
3、 http://blog.csdn.net/hobbs136/article/details/7619719
4、 http://blog.csdn.net/yushitao/article/details/43565851