検索
ホームページデータベースRedisRedis はシングルスレッドですか?それともマルチスレッドですか?なぜですか?

Redis はシングルスレッドですか?それともマルチスレッドですか?なぜですか?

Dec 18, 2020 pm 03:08 PM
redisシングルスレッドマルチスレッド化

Redis4.0 より前はシングル スレッドで実行されていましたが、Redis4.0 以降はマルチスレッドのサポートが開始されました。 Redis 4.0 より前にシングル スレッドが使用されていた理由: 1. シングル スレッド モードは開発とデバッグに便利です; 2. Redis は内部で epoll ベースの多重化を使用します; 3. Redis の主なパフォーマンスのボトルネックはメモリまたはネットワーク帯域幅です。

Redis はシングルスレッドですか?それともマルチスレッドですか?なぜですか?

(学習ビデオ共有: redis ビデオ チュートリアル)

Redis4 では、Redis のバージョンが異なると異なります。 0, Redis はシングル スレッドで実行されましたが、シングル スレッドだからといって効率が低いわけではありません。Nginx や Nodejs もシングル スレッド プログラムですが、効率は低くありません。

その理由は、Redis がメモリに基づいているためです。そのボトルネックは、CPU ではなく、マシンのメモリとネットワーク帯域幅にあります。CPU がボトルネックに達する前に、マシンのメモリがいっぱいになるか、帯域幅が限界に達する可能性があります。ボトルネック。したがって、CPU が主な理由ではないので、シングルスレッドを使用するのは当然ですが、マルチスレッドを使用するとさらに面倒になります。

しかし、Redis 4.0 では、バックグラウンド削除やその他の機能などのマルチスレッドのサポートが開始されました。

簡単に言うと、Redis は 4.0 より前にシングルスレッド モードを使用していました。その理由は次の 3 つです。

  • Redis をシングルスレッド モードで使用すると、その開発とメンテナンスがより簡単になります。シングルスレッド モードは開発とデバッグを容易にするため、シンプルです。

  • シングルスレッド モデルが使用されている場合でも、主に Redis が内部で epoll ベースの多重化を使用しているため、複数のクライアント リクエストを同時に処理できます。

  • Redis の場合、主なパフォーマンスのボトルネックは CPU ではなく、メモリまたはネットワーク帯域幅です。

しかし、Redis は 4.0 以降のバージョンで遅延削除 (非同期削除とも呼ばれる) を導入しました。これは、非同期メソッドを使用して Redis 内のデータを削除できることを意味します。例:

  • unlink key: del キーと同様に、指定したキーを削除します。キーが存在しない場合、キーはスキップされます。ただし、del はブロッキングを引き起こし、unlink コマンドは別のスレッドでメモリを再利用します。つまり、非ブロッキングです [http://www.redis.cn/commands/unlink.html];

  • flushdb async: 現在のデータベース内のすべてのデータを削除します [http://www.redis.cn/commands/flushdb.html];

  • flushall async: 削除すべてのライブラリのすべてのデータ データ [http://www.redis.cn/commands/flushall.html]。

この処理の利点は、Redis のメイン スレッドが停止することがなく、これらの操作が実行のためにバックグラウンド スレッドに渡されることです。

[通常、del 命令を使用するとデータをすばやく削除できますが、削除されたキーが非常に大きなオブジェクトである場合、たとえば、数千の要素を含むハッシュ セットを削除する場合、del 命令により Redis エラーが発生します。メインスレッドがフリーズするため、遅延削除を使用すると、Redis のフリーズ問題を効果的に回避できます。 ]

テスト ポイント分析:

Redis スレッド モデル (シングルスレッドまたはマルチスレッド) に関する質問は、Redis が尋ねなければならない質問のほぼ 1 つですが、うまく答えられる人は多くはありません。ほとんどの人は、Redis がシングルスレッドであることと、シングルスレッドの多くの利点を述べるだけしかできませんが、特に Redis4.0 と Redis6.0 のマルチスレッドの特性については正確に答えることができます。 Redis6.0では人が少ないです。シングルスレッドとマルチスレッドの関連知識に関しては、次のような面接の質問もあります。

1. Redis のメインスレッドはシングルスレッドであるのに、なぜこれほど高速なのでしょうか?

2. Redis に IO 多重化を導入しますか?

3. Redis6.0 でマルチスレッドを導入しますか?

1. Redis はなぜそれほど速いのでしょうか?

理由は次のとおりです:

a. メモリベースの操作: Redis のすべてのデータはメモリに保存されるため、すべての操作はメモリ レベルで行われるため、パフォーマンスは比較的低くなります。高い。

b. シンプルなデータ構造: Redis のデータ構造は比較的シンプルで、Redis 用に特別に設計されており、これらのシンプルなデータ構造の検索と操作の時間計算量は O(1) です。

c. 多重化およびノンブロッキング IO: Redis は、IO 多重化機能を使用して複数のソケット接続を持つクライアントをリッスンするため、1 つのスレッドを使用して複数の状況を処理できるようになり、スレッドが削減されます。また、IO ブロック操作も回避されるため、Redis のパフォーマンスが大幅に向上します。

d. コンテキストの切り替えを回避する: シングルスレッド モデルであるため、不必要なコンテキストの切り替えとマルチスレッドの競合が回避され、マルチスレッドの切り替えによって生じる時間とパフォーマンスのオーバーヘッドが節約されます。デッドロックの問題を引き起こさないようにします。

公式ベンチマーク テストの結果は、シングルスレッド Redis が 10W/S のスループットを達成できることを示しています。

2.IO多重化とは何ですか?

ソケットの読み取りメソッドと書き込みメソッドはデフォルトでブロックされています。たとえば、読み取り操作の読み取りメソッドが呼び出されたとき、バッファーにデータがない場合、スレッドは次の処理が完了するまでここでスタックします。バッファにデータがある場合、または接続が閉じられると、読み取りメソッドが戻り、スレッドは他のビジネスの処理を続行できます。

しかし、これは明らかにプログラムの実行効率を低下させ、Redis はノンブロッキング IO を使用します。つまり、IO の読み取りおよび書き込みプロセスがブロックされなくなり、読み取りおよび書き込みメソッドが完了して即座に返されます。つまり、IO 操作を実行するために、読み取り可能な限り読み取り、書き込み可能な限り書き込みを行うという戦略が使用されます。これは明らかにパフォーマンスの追求により一致します。

しかし、この種のノンブロッキング IO には問題もあります。つまり、読み取り操作を実行するときに、データの一部だけが読み取られる可能性があります。同じことがデータの書き込みにも当てはまります。バッファがいっぱいで、データがまだ書き込まれていない場合、有効なデータがいつ書き込まれるかが問題になります。

IO の多重化により、上記の問題は解決されます。IO 多重化を使用する最も簡単な方法は、select 関数を使用することです。この関数は、オペレーティング システムがユーザー プログラムに提供する API インターフェイスです。使用するために使用されます。複数のファイル記述子の読み取り可能性と書き込み可能性を監視して、ファイル記述子の読み取りおよび書き込みイベントを監視できます。対応する時間を監視すると、スレッドに対応するビジネスを処理するよう通知できるため、Redis の読み取りおよび書き込み機能が正常に実行されることが保証されます。

[ただし、select 関数は基本的に現在のオペレーティング システムには適用できず、代わりに epoll 関数 (Linux) が呼び出されます。macOS では、select 関数が非常に重要であるため、Kqueue (Unix から継承) が使用されます。ファイル記述子が多いと、パフォーマンスが非常に低下します。 】

3. Redis6.0 でのマルチスレッド?

Redis のシングルスレッドの利点は非常に大きく、Redis の内部実装の責任が軽減されるだけでなく、すべての操作をロックなしで実行できるため、デッドロックやデッドロックが発生することもありません。スレッドの切り替え、パフォーマンスと時間の消費、しかしその欠点も明らかです。シングルスレッドのメカニズムでは、Redis の QPS (Query Per Second、1 秒あたりのクエリ数) を効果的に改善することが困難です (十分な速度ではありますが、ユーザーは依然としてより高速な処理を行う必要があります)。追跡)。

Redis はバージョン 4.0 でマルチスレッドを導入しましたが、このバージョンのマルチスレッドは大量のデータの非同期削除にのみ使用でき、削除以外の操作にはあまり意味がありません。

Redis マルチスレッドを使用すると、Redis の同期読み取りおよび書き込み IO のプレッシャーを共有し、マルチコア CPU リソースを最大限に活用し、Redis の QPS を効果的に向上させることができます。 Redis は IO 多重化を使用し、ノンブロッキング IO に基づいて動作しますが、IO 自体の読み取りと書き込みはブロッキングです。たとえば、ソケットにデータがある場合、Redis はまずカーネル空間からユーザー空間にデータをコピーし、その後関連する操作を実行しますが、このコピー プロセスがブロックされており、データ量が多くなると、これらの操作は単一のスレッドに基づいて完了します。

したがって、IO 読み取りおよび書き込みパフォーマンスを向上させるために、新しいマルチスレッド機能が Redis6.0 に追加されました。その主な実装アイデアは、メインスレッドの IO 読み取りおよび書き込みタスクをグループに分割することです。独立したスレッド: 実行により、複数のソケットの読み取りと書き込みを並列化できますが、Redis コマンドは依然としてメインスレッドによってシリアルに実行されます。

ただし、注意: Redis6.0 はデフォルトでマルチスレッドを無効にしますが、構成ファイル redis.conf の io-threads-do-reads を true に設定することで有効にできます。しかし、それだけでは不十分です。さらに、マルチスレッド機能を正しく有効にするためにスレッド数を設定する必要もあります。また、Redis 構成を変更する必要もあります。たとえば、io-threads 4 を設定すると、4 つのスレッドが開かれることになります。

[スレッド数の設定については、4 コア CPU の場合は 2 または 3 に、8 コア CPU の場合は 2 または 3 に設定することが公式推奨されています。つまり、スレッド数はマシンの CPU コア数よりも小さい必要があり、スレッド数は多ければ多いほど良いです。 】

Redis のパフォーマンスに関して、Redis の作成者は 2019 RedisConf カンファレンスで、Redis 6.0 で導入されたマルチスレッド IO 機能によりパフォーマンスが少なくとも 2 倍になったと述べました。また、中国人は Alibaba Cloud 上の 4 スレッド Redis バージョンとシングルスレッド Redis バージョンを使用して比較テストを実施しましたが、テスト結果は Redis 作者の発言と一致しており、基本的にパフォーマンスが 2 倍になる可能性があることがわかりました。

概要:

この記事では、Redis が 4.0 より前のシングル スレッドでも高速である理由を紹介します。これは、メモリ操作、シンプルなデータ構造、IO 多重化とノンブロッキング IO、不要なスレッドの回避に基づいています。コンテキストの切り替え。そして Redis 4.0 では、マルチスレッドのサポートが開始されました。これは主に、リンク解除キー、flushdb async、flushall async などのビッグデータの非同期削除に反映されています。 Redis 6.0 のマルチスレッドにより、IO 読み取りおよび書き込みの同時実行機能が向上し、Redis のパフォーマンスが向上します。

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

以上がRedis はシングルスレッドですか?それともマルチスレッドですか?なぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Redis:データモデルと構造の調査Redis:データモデルと構造の調査Apr 16, 2025 am 12:09 AM

Redisのデータモデルと構造には、5つの主要なタイプが含まれます。1。文字列:テキストまたはバイナリデータの保存に使用され、原子操作をサポートします。 2。リスト:キューとスタックに適した注文された要素コレクション。 3.セット:順序付けられていない一意の要素セット、セット操作をサポートします。 4。注文セット(sortedset):ランキングに適したスコアを持つ一意の要素セット。 5。ハッシュテーブル(ハッシュ):オブジェクトの保存に適したキー価値ペアのコレクション。

Redis:データベースアプローチの分類Redis:データベースアプローチの分類Apr 15, 2025 am 12:06 AM

Redisのデータベースメソッドには、メモリ内データベースとキー価値ストレージが含まれます。 1)Redisはデータをメモリに保存し、速く読み取り、書き込みます。 2)キー価値のペアを使用してデータを保存し、キャッシュやNOSQLデータベースに適したリスト、コレクション、ハッシュテーブル、注文コレクションなどの複雑なデータ構造をサポートします。

なぜRedisを使用するのですか?利点と利点なぜRedisを使用するのですか?利点と利点Apr 14, 2025 am 12:07 AM

Redisは、高速パフォーマンス、リッチデータ構造、高可用性とスケーラビリティ、持続性能力、幅広いエコシステムサポートを提供するため、強力なデータベースソリューションです。 1)非常に速いパフォーマンス:Redisのデータはメモリに保存され、非常に速い読み取り速度と書き込み速度が高く、高い並行性と低レイテンシアプリケーションに適しています。 2)豊富なデータ構造:さまざまなシナリオに適したリスト、コレクションなど、複数のデータ型をサポートします。 3)高可用性とスケーラビリティ:マスタースレーブの複製とクラスターモードをサポートして、高可用性と水平スケーラビリティを実現します。 4)持続性とデータセキュリティ:データの整合性と信頼性を確保するために、データの持続性がRDBとAOFを通じて達成されます。 5)幅広い生態系とコミュニティのサポート:巨大なエコシステムとアクティブなコミュニティにより、

NOSQLの理解:Redisの重要な機能NOSQLの理解:Redisの重要な機能Apr 13, 2025 am 12:17 AM

Redisの主な機能には、速度、柔軟性、豊富なデータ構造のサポートが含まれます。 1)速度:Redisはメモリ内データベースであり、読み取り操作はほとんど瞬間的で、キャッシュとセッション管理に適しています。 2)柔軟性:複雑なデータ処理に適した文字列、リスト、コレクションなど、複数のデータ構造をサポートします。 3)データ構造のサポート:さまざまなビジネスニーズに適した文字列、リスト、コレクション、ハッシュテーブルなどを提供します。

Redis:主要な機能を特定しますRedis:主要な機能を特定しますApr 12, 2025 am 12:01 AM

Redisのコア関数は、高性能のメモリ内データストレージおよび処理システムです。 1)高速データアクセス:Redisはデータをメモリに保存し、マイクロ秒レベルの読み取り速度と書き込み速度を提供します。 2)豊富なデータ構造:文字列、リスト、コレクションなどをサポートし、さまざまなアプリケーションシナリオに適応します。 3)永続性:RDBとAOFを介してディスクにデータを持続します。 4)サブスクリプションを公開:メッセージキューまたはリアルタイム通信システムで使用できます。

Redis:一般的なデータ構造のガイドRedis:一般的なデータ構造のガイドApr 11, 2025 am 12:04 AM

Redisは、次のようなさまざまなデータ構造をサポートしています。1。文字列、単一価値データの保存に適しています。 2。キューやスタックに適したリスト。 3.非重複データの保存に使用されるセット。 4。ランキングリストと優先キューに適した注文セット。 5。オブジェクトまたは構造化されたデータの保存に適したハッシュテーブル。

Redisカウンターを実装する方法Redisカウンターを実装する方法Apr 10, 2025 pm 10:21 PM

Redisカウンターは、R​​edisキー価値ペアストレージを使用して、カウンターキーの作成、カウントの増加、カウントの減少、カウントのリセット、およびカウントの取得など、カウント操作を実装するメカニズムです。 Redisカウンターの利点には、高速速度、高い並行性、耐久性、シンプルさと使いやすさが含まれます。ユーザーアクセスカウント、リアルタイムメトリック追跡、ゲームのスコアとランキング、注文処理などのシナリオで使用できます。

Redisコマンドラインの使用方法Redisコマンドラインの使用方法Apr 10, 2025 pm 10:18 PM

Redisコマンドラインツール(Redis-Cli)を使用して、次の手順を使用してRedisを管理および操作します。サーバーに接続し、アドレスとポートを指定します。コマンド名とパラメーターを使用して、コマンドをサーバーに送信します。ヘルプコマンドを使用して、特定のコマンドのヘルプ情報を表示します。 QUITコマンドを使用して、コマンドラインツールを終了します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。