RedisスレッドI / Oモデル

バックグラウンド

  • Redisはシングルスレッドですが、なぜredisはマルチスレッドではなくシングルスレッドを使用するのですか?
  • Redisはメモリに基づいてデータを保存するため、CPUはredisのボトルネックではありません。
  • なぜ通常マルチスレッドを使用するのですか?並行処理により、処理効率が向上します。また、システムは通常、処理の前にディスクに格納されたデータ(データベース、ローカルファイルなど)を読み取るためにIOを実行する必要があるため、シングルスレッドは非常に簡単にブロックでき、サービススループットが低下します。
  • しかし、redisはそうではなく、Redisはメモリベースであり、すべての操作はメモリレベルの操作です。これで、マルチスレッドを開く方が速くなりませんか?マルチスレッドの存在にも問題がありますが、redisにはマルチスレッドの使用とシングルスレッドの使用との間のトレードオフがあります。結局、シングルスレッドは良い選択です(個人的な理解)
  • マルチスレッドによって引き起こされる問題:
    1. 複雑なコード
    2. 並行性のセキュリティの問題
    3. コンテキストスレッドの切り替えなどのパフォーマンスの問題
  • redisはシングルスレッドを使用しているため、シングルスレッドのパフォーマンスを最大化するにはどうすればよいですか?次に、redisのスレッドIOモデルがどのように設計されているかを確認する必要がありますか?

RedisスレッドIOモデル

ノンブロッキングIO

IOプロセス

  1. クライアントがサーバーへのI / Oリンクを開始すると、サーバーはスレッドが開始され、ファイルが来るかどうかを監視します。IOをブロックしている場合は、常にデータがなくなるまで戻りません。入ると、先ほど述べたノンブロッキングI / Oが直接返され、このスレッドは他のことを実行できます。しかし、ノンブロッキングIOには明らかな問題があり、いつデータがあり、いつデータが返されるのか、彼にはわかりません。私がやりたいことは、長いローテーショントレーニングを行うことです。クライアントが数百万ある場合、redis CPUはボトルネックと見なされ、空のローテーショントレーニングが発生します(結果としてパフォーマンスが無駄になります)。

IO多重化

  1. イベントポーリングAPIは、この問題を解決するために使用されます。最も単純なイベントポーリングAPIは、オペレーティングシステムがユーザープログラムに提供するAPIであるselect関数です。入力は読み取りおよび書き込み記述子リストread_fds&write_fdsであり、出力は対応する読み取りおよび書き込みイベントです。同時に、タイムアウトパラメータも提供され、イベントが発生しない場合、最大でタイムアウト時間待機し、スレッドはブロックされた状態になります。期間中にイベントが発生すると、すぐに戻ることができます。時間が経過してもイベントは発生せず、すぐに戻ります。イベントを取得した後、スレッドは対応するイベントを1つずつ処理し続けることができます。処理後、ポーリングを続行します。つまり、スレッドは無限ループに入ります。この無限ループをイベントループと呼び、ループはサイクルです。オペレーティングシステムが異なれば、イベントポーリングAPIも異なります。ここでのselect()も比較的原始的な多重化APIであり、後の最適化にはepolloなどが含まれます。(Https://segmentfault.com/a/1190000003063859)
    ここに画像の説明を挿入

命令キュー

  1. redisはシングルスレッドであるため、すべてのユーザー命令を格納する独自の命令キューがあり、これは公平な方法です。最初に来る人。

応答キュー

  1. Redisは、各クライアントソケットの応答キューも関連付けます。Redisサーバーは、応答キューを介して命令の結果をクライアントに応答します。キューが空の場合は、接続が一時的にアイドルであり、書き込みイベントを取得する必要がないことを意味します。つまり、現在のクライアント記述子をwrite_fdsから移動できます。キューにデータが入るまで待ってから、記述子を入れます。selectシステムコールで書き込みイベントをすぐに返さないようにすると、書き込むデータがないことがわかります。この状況のスレッドは、CPUを急上昇させます。

総括する

  • Redisは、シングルスレッドI / O多重化スレッドモデルです。
  • 命令キューと応答キューを介して、redis命令を規則正しく実行できます。

参照

  • 「Redisディープアドベンチャー」

おすすめ

転載: blog.csdn.net/weixin_40413961/article/details/108457087