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) ハードディスク データベースの動作モード:
(2) メモリ データベースの動作モード:
上記の説明を読んだ後、Redis とは何か、Redis の一般的なデータ構造タイプは何か、Redis はどのように永続化されるのかなど、Redis 関連の面接でよくある質問についてある程度理解できましたか。
Redis は、単一プロセス、単一スレッド モデルを使用するメモリベースの KV データベースを使用します。C 言語で記述されています。提供される公式データは 100,000 QPS (1 秒あたりのクエリ数) に達します。 。
このデータは、単一プロセスとマルチスレッドを使用する同じメモリベースの KV データベース Memcached よりも劣りません。
横軸は接続数、縦軸はQPSです。現時点では、この写真は桁違いに反映されています。面接中にそれを正しく説明できることを願っています。答えが桁違いかどうかは聞かないでください。
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 が永続化されると、サブプロセスまたはサブスレッドとして実行されます (特定のサブスレッドまたはサブプロセスについては、読者が詳しく調べる必要があります)。
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 が非常に高速であるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

Redisデータをクリアする方法:Flushallコマンドを使用して、すべての重要な値をクリアします。 FlushDBコマンドを使用して、現在選択されているデータベースのキー値をクリアします。 [選択]を使用してデータベースを切り替え、FlushDBを使用して複数のデータベースをクリアします。 DELコマンドを使用して、特定のキーを削除します。 Redis-CLIツールを使用してデータをクリアします。

Redisのキューを読むには、キュー名を取得し、LPOPコマンドを使用して要素を読み、空のキューを処理する必要があります。特定の手順は次のとおりです。キュー名を取得します:「キュー:キュー」などの「キュー:」のプレフィックスで名前を付けます。 LPOPコマンドを使用します。キューのヘッドから要素を排出し、LPOP Queue:My-Queueなどの値を返します。空のキューの処理:キューが空の場合、LPOPはnilを返し、要素を読む前にキューが存在するかどうかを確認できます。

Redis指令を使用するには、次の手順が必要です。Redisクライアントを開きます。コマンド(動詞キー値)を入力します。必要なパラメーターを提供します(指示ごとに異なります)。 Enterを押してコマンドを実行します。 Redisは、操作の結果を示す応答を返します(通常はOKまたは-ERR)。

Redisを使用して操作をロックするには、setnxコマンドを介してロックを取得し、有効期限を設定するために有効期限コマンドを使用する必要があります。特定の手順は次のとおりです。(1)SETNXコマンドを使用して、キー価値ペアを設定しようとします。 (2)expireコマンドを使用して、ロックの有効期限を設定します。 (3)Delコマンドを使用して、ロックが不要になったときにロックを削除します。

Redisソースコードを理解する最良の方法は、段階的に進むことです。Redisの基本に精通してください。開始点として特定のモジュールまたは機能を選択します。モジュールまたは機能のエントリポイントから始めて、行ごとにコードを表示します。関数コールチェーンを介してコードを表示します。 Redisが使用する基礎となるデータ構造に精通してください。 Redisが使用するアルゴリズムを特定します。

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

Centosシステムでは、Redis構成ファイルを変更するか、Redisコマンドを使用して悪意のあるスクリプトがあまりにも多くのリソースを消費しないようにすることにより、LUAスクリプトの実行時間を制限できます。方法1:Redis構成ファイルを変更し、Redis構成ファイルを見つけます:Redis構成ファイルは通常/etc/redis/redis.confにあります。構成ファイルの編集:テキストエディター(VIやNANOなど)を使用して構成ファイルを開きます:sudovi/etc/redis/redis.conf luaスクリプト実行時間制限を設定します。
