Redis がシングルスレッドであるのはなぜですか?また、Redis が非常に高速であるのはなぜですか?

青灯夜游
リリース: 2021-07-22 10:29:13
転載
5906 人が閲覧しました

Redis がシングルスレッドであるのはなぜですか?また、Redis が非常に高速であるのはなぜですか?

Java 関連のほとんどすべての面接では、キャッシュに関する質問が行われます。より基本的な面接では、「80/20 ルール」とは何か、「ホット データとコールド データ」とは何かが尋ねられます。より複雑なものでは、キャッシュなだれ、キャッシュのペネトレーション、キャッシュの予熱、キャッシュの更新、キャッシュのダウングレードなどについて尋ねられます。これらの一見一般的ではない概念はすべて、キャッシュ サーバーに関連しています。一般的に使用されるキャッシュ サーバーには、Redis や Memcached などが含まれます。著者は現在 Redis のみを使用しています。

これまでの面接で面接官に「なぜ Redis はシングルスレッドと言われているのですか?なぜ Redis はこんなに速いのですか?」と質問されたことがない場合は、 》という方は、この記事を読んだら、とてもラッキーなことだと感じていただけるはずです!あなたが質の高いインタビュアーであれば、この質問を使用して、あなたの向かい側にある「物事を見透かしている」友人にインタビューして、彼の習熟度を試すこともできます。 ######わかった!要点を理解しましょう!まず、Redis とは何か、なぜ Redis が非常に速いのかについて説明し、次に、なぜ Redis がシングルスレッドであるのかについて説明しましょう。 [関連する推奨事項:

Redis ビデオ チュートリアル

]

1. Redis の概要

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

文字列、ハッシュ、リスト、セット、ソート セット、ZSet、範囲クエリ、ビットマップ、ハイパーログログ、地理空間インデックス半径クエリなどの複数のタイプのデータ構造をサポートします。その中で、一般的な 5 つのデータ構造タイプは、String、List、Set、Hash、ZSet です。

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

Redis には、ユーザーがデータをストレージ用にディスクに保存できる永続化オプションも用意されています。実際の状況に応じて、データ セットを一定の間隔でディスク (スナップショット) にエクスポートしたり、コマンド ログに追加したりできます (AOF はファイルのみを追加します)。書き込みコマンドを実行すると、実行された書き込みコマンドがハードウェアにコピーされます。ディスクです。永続性をオフにして、Redis を効率的なネットワーク キャッシュ データ機能として使用することもできます。

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

データベースの動作モードは、保存方法に応じてハードディスクデータベースとメモリデータベースに分けられます。 Redis はデータをメモリに保存し、データの読み書きの際にハードディスクの I/O 速度の制限を受けないため、非常に高速です。

(1) ハードディスク データベースの動作モード:

Redis がシングルスレッドであるのはなぜですか?また、Redis が非常に高速であるのはなぜですか? (2) メモリ データベースの動作モード:

Redis がシングルスレッドであるのはなぜですか?また、Redis が非常に高速であるのはなぜですか?上記の説明を読んだ後、Redis とは何か、Redis の一般的なデータ構造タイプは何か、Redis はどのように永続化されるのかなど、Redis 関連の面接でよくある質問についてある程度理解できましたか。

2. Redis の速度はどれくらいですか?

Redis は、単一プロセス、単一スレッド モデルを使用するメモリベースの KV データベースを使用します。C 言語で記述されています。提供される公式データは 100,000 QPS (1 秒あたりのクエリ数) に達します。 。

このデータは、単一プロセスとマルチスレッドを使用する同じメモリベースの KV データベース Memcached よりも劣りません。

Redis がシングルスレッドであるのはなぜですか?また、Redis が非常に高速であるのはなぜですか?横軸は接続数、縦軸はQPSです。現時点では、この写真は桁違いに反映されています。面接中にそれを正しく説明できることを願っています。答えが桁違いかどうかは聞かないでください。

3. 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 がある場合、 /O イベントの場合、ブロック状態からウェイクアップするため、プログラムはすべてのストリームをポーリングし (epoll は実際にイベントを発行したストリームのみをポーリングします)、準備ができたストリームのみを順番に処理します。このアプローチにより、多くの無駄な処理が回避されます。オペレーション。

ここで、「マルチチャネル」は複数のネットワーク接続を指し、「再利用」は同じスレッドを再利用することを指します。

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

4. では、なぜ Redis はシングルスレッドなのでしょうか?

上記の分析はすべて、Redis が高速であるという雰囲気を作り出すためであることをまず理解する必要があります。公式 FAQ には、Redis はメモリベースの操作であるため、CPU が Redis のボトルネックになるのではなく、Redis のボトルネックはマシンのメモリ サイズまたはネットワーク帯域幅である可能性が高いと記載されています。シングルスレッドは実装が簡単で、CPU がボトルネックにならないため、シングルスレッド ソリューションを採用するのが合理的です (結局のところ、マルチスレッドを使用すると多くの問題が発生します!)。

これを見たら泣けるかもしれません!単一スレッドを使用して Redis をこれほど高速にするには、いくつかの主要な技術的ポイントがあるだろうと思っていましたが、私たちをだましているように見える公式の回答は期待していませんでした。ただし、Redis が高速である理由はすでに明確に説明できており、シングルスレッド モードですでに高速であるため、マルチスレッドを使用する必要はありません。

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

警告 1: ここで強調している単一スレッドには、ネットワーク リクエストを処理するためのスレッドが 1 つしかありません。正式な Redis サーバーの実行時には、複数のスレッドが必要です。ここでは、明確に注意してください。たとえば、Redis が永続化されると、サブプロセスまたはサブスレッドとして実行されます (特定のサブスレッドまたはサブプロセスについては、読者が詳しく調べる必要があります)。

Redis がシングルスレッドであるのはなぜですか?また、Redis が非常に高速であるのはなぜですか?

ps コマンドの「-T」パラメータは、スレッドを表示することを示します (SPID 列も含まれる可能性があります)。 「SID」列はスレッドIDを示し、「CMD」列はスレッド名を表示します。

警告 2: 上の図の FAQ の最後の段落には、マルチスレッドが Redis バージョン 4.0 からサポートされると記載されていますが、マルチスレッド操作は特定の操作でのみ実行されます。したがって、この記事が将来のバージョンでもシングルスレッドになるかどうかは、読者が確認する必要があります。

5. 注意事項

1. Redis は「シングルスレッド多重 IO モデル」を使用して高性能メモリ データ サービスを実装していることがわかっています。ロックの使用ですが、同時にこのメカニズムにより、Sunion などの時間のかかるコマンドを実行する際の Redis の同時実行性が低下します。

シングルスレッドであるため、同時に進行する操作は 1 つだけであるため、時間のかかるコマンドは読み取り同時実行数だけでなく書き込み同時実行数も低下します。 1 つのスレッドは 1 つの CPU コアしか使用できないため、同じマルチコア サーバー内で複数のインスタンスを起動して、マスター/マスターまたはマスター/スレーブを形成することができ、時間のかかる読み取りコマンドはスレーブ上で完全に実行できます。

Redis.conf の変更が必要な項目:

pidfile /var/run/redis/redis_6377.pid #pidfile にポート番号

port 6377 を追加する必要があります。 #これは必須です Changed

logfile /var/log/redis/redis_6377.log #ログファイルの名前もポート番号とともに追加されます

dbfilename dump_6377.rdb #rdbfile も追加されます

2. 「オペレーティング システムの負荷分散をさせることはできません。なぜなら、私たちは自分たちのプログラムをよく知っているからです。そのため、CPU を過度に占有したり、キーを使用したりすることなく、手動で CPU コアをプログラムに割り当てることができます。」

CPU は重要な影響要因です。Redis はシングルスレッド モデルであるため、複数のコアよりも大規模なキャッシュと高速な CPU を好みます。

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

6. 展開

以下にも、知っておくべきモデルがいくつかあります。面接が成功することを祈っています。

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

2. マルチプロセスモデル: Oracle (Linux 版);

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

(1) 単一プロセス起動: 現時点ではシステム内にプロセスが 1 つだけ存在し、マスター プロセスとワーカー プロセスの両方の役割を果たします。

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

(3) マスター プロセスは主に一部のグローバルな初期化作業とワーカーの管理を実行し、イベント処理はワーカーで実行されます。

Redis がシングルスレッドであるのはなぜですか?また、Redis が非常に高速であるのはなぜですか?

プログラミング関連の知識について詳しくは、プログラミング入門をご覧ください。 !

以上がRedis がシングルスレッドであるのはなぜですか?また、Redis が非常に高速であるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!