Redis は、キーと値のペアに基づく NoSQL データベースです。Redis の値は、文字列、ハッシュ、リスト、セット、zset、ビットマップ、HyperLogLog などのさまざまなデータ構造とアルゴリズムで構成できます。 Redis には、キーの有効期限、パブリッシュとサブスクライブ、トランザクション、Lua スクリプト、センチネル、クラスターなど、多くの機能があります。
公式パフォーマンス データによると、Redis は非常に高速でコマンドを実行でき、QPS は 100,000 以上に達することがあります。そこでこの記事では、Redis がどこが速いのか、主に次の点を含めて紹介します:
1. 開発言語
現在、私たちはプログラミングに高級言語を使用しています。 、Java、Pythonなど。 C言語というと古いイメージがあるかもしれませんが、とても便利で、なんといってもUnixシステムはCで実装されているため、C言語はオペレーティングシステムに非常に近い言語です。 RedisはC言語で開発されているため、実行が高速になります。
もう 1 つ、学生は C 言語の学習に重点を置くべきです。C 言語はコンピュータのオペレーティング システムをより深く理解するのに役立ちます。高級言語を学んだ後は、下位層に注意を払う必要がなくなるなどとは考えないでください。借りた借金は必ず返済しなければなりません。ここでは、より難しい本である「Deep Understanding of Computing System」をお勧めします。
2. 純粋なメモリ アクセス
Redis はメモリを使用してすべてのデータを保存するため、通常の操作中にデータ以外の同期のためにディスクからデータを読み取る必要はありません。 IO の数は 0 です。メモリの応答時間は約 100 ナノ秒で、これは Redis の高速性の重要な基盤です。まずは CPU の速度を見てみましょう:
私のコンピュータを例にとると、その主な周波数は 3.1G で、これは 1 秒あたり 31 億命令を実行できることを意味します。 CPU の世界観の処理速度は非常に遅く、それに比べてメモリは 100 倍、ディスクは 100 万倍遅いのですが、これは速いと思いますか?
「コンピュータ システムの徹底理解」から画像を借用しましたが、これは典型的なメモリ階層を示しています。L0 層では、CPU は 1 クロック サイクルでアクセスでき、SRAM ベースのキャッシュはこれらは数 CPU クロック サイクルでアクセスでき、次に DRAM ベースのメイン メモリには数十から数百クロック サイクルでアクセスできます。
3. シングル スレッド
シングル スレッドはアルゴリズムの実装を簡素化できますが、同時実行の実装が難しいだけではありません。データ構造も複雑ですが、テストも難しく、非常に面倒です。サーバーサイド開発では、ロックとスレッド切り替えは通常パフォーマンスを低下させる原因となるため、単一スレッドを使用することでそれらによる消費を回避できます。もちろん、シングルスレッドにも欠点があり、それは Redis の悪夢でもあるブロッキングです。コマンドの実行が長すぎると、他のコマンドがブロックされます。これは Redis にとって非常に致命的であるため、Redis は高速実行シナリオ用のデータベースです。
Redis に加えて、Node.js もシングルスレッドであり、Nginx もシングルスレッドですが、どちらも高性能サーバーのモデルです。
4. ノンブロッキング マルチチャネル I/O 多重化メカニズム
その前に、When read またはwrite は、特定のファイル記述子 (ファイル記述子 FD) の読み取りまたは書き込みを行います。データが受信されない場合、データが受信されるまでスレッドは一時停止されます。
ブロッキング モデルは理解しやすいですが、複数のクライアント タスクを処理する必要がある場合には使用されません。
#I/O 多重化とは、実際には、複数の接続を同じプロセスで管理できることを意味します。マルチチャネルとはネットワーク接続を指し、多重化は同じスレッドにすぎません。ネットワークサービスにおいて、I/O多重化の役割は複数の接続イベントを一度に業務コードに通知することであり、処理方法は業務コードによって決まります。
I/O多重化モデルにおいて最も重要な関数呼び出しはI/O多重化機能であり、このメソッドは複数のファイルディスクリプタ(fd)の読み書きを同時に監視することができます。 fd が読み取り/書き込み可能である場合、このメソッドは読み取り/書き込み可能な fd の数を返します。
Redis は、I/O 多重化テクノロジの実装として epoll を使用しており、Redis 独自のイベント処理モデルは、時間を無駄にすることなく epoll の読み取り、書き込み、クローズなどのイベントを変換します。ネットワーク I/O について。複数の FD の読み取りと書き込みの監視を実現し、パフォーマンスを向上させます。
鮮やかな例を挙げてみましょう。たとえば、TCP サーバーは 20 個のクライアント ソケットを処理します。
計画: 逐次処理。ネットワーク カードのせいで最初のソケットのデータ読み取りが遅い場合、それがブロックされると、残りのソケットが台無しになります。
プラン B: ソケット リクエストごとにクローン サブプロセスを作成します。言うまでもなく、各プロセスは大量のシステム リソースを消費します。プロセスの切り替えだけでも、オペレーティング システムに十分な負担がかかります。
C スキーム (I/O 多重化モデル、epoll): ユーザーソケットに対応する fd を epoll に登録します (実際にサーバーとオペレーティングシステム間で受け渡されるのはソケットの fd ではなく、fd_set のデータ構造です) )、そして epoll どのソケットを読み取り/書き込みする必要があるかを指示するだけで、アクティブで変化するソケット fd を処理するだけで済みます。
この方法では、epoll が呼び出された場合にのみプロセス全体がブロックされ、顧客メッセージの送受信はブロックされません。
以上がRedis はなぜそれほど速いのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。