Redis はなぜ速いのですか?レディスはどこですか?次の記事は、Redis が高速である理由を分析するのに役立ちます。
Redis は、キーと値のペアに基づく NoSQL データベースです。Redis の値は、文字列、ハッシュ、リスト、セット、zset、ビットマップ、HyperLogLog で構成できます。さまざまなデータ構造とアルゴリズム。 Redis は、キーの有効期限、パブリッシュとサブスクライブ、トランザクション、Lua スクリプト、センチネル、クラスター、その他の機能も提供します。 [関連する推奨事項: Redis ビデオ チュートリアル ]
Redis はコマンドを非常に高速に実行し、公式のパフォーマンスによれば、10w qps に達することがあります。そこで、この記事では主に Redis のどこが速いのか、主に次の点を含めて紹介します:
1. 開発言語
現在、私たちは皆、高言語を使用しています。レベル言語 Java、Python などのプログラムを作成すること。 C言語というと古いイメージがあるかもしれませんが、とても便利で、なんといってもUnixシステムはCで実装されているため、C言語はオペレーティングシステムに非常に近い言語です。 RedisはC言語で開発されているため、実行が高速になります。
さらに、大学生が C をよく学ぶと、コンピューターのオペレーティング システムをより深く理解できるようになります。高級言語を学んだ後は、下位層に注意を払う必要がなくなるなどとは考えないでください。借りた借金は必ず返済しなければなりません。ここでは、より難しい本である「Deep Understanding of Computing System」をお勧めします。
2. 純粋なメモリ アクセス
Redis はすべてのデータをメモリに配置します。非データ同期は正常に機能し、メモリから取得する必要はありません。ディスク。データの読み取り、IO 回は 0 回。メモリの応答時間は約 100 ナノ秒で、これは Redis の高速性の重要な基盤です。まず CPU の速度を見てみましょう:
私のコンピュータを例にとると、主な周波数は 3.1G です。つまり、3.1*10^ を実行できることになります。 1 秒あたり 9 命令。つまり、CPU が世界を認識する速度は非常に遅く、メモリは CPU の 100 倍、ディスクは 100 万倍も遅いのです。
「コンピュータ システムの徹底理解」から画像を借用しましたが、これは典型的なメモリ階層を示しています。L0 層では、CPU は 1 クロック サイクルでアクセスでき、SRAM ベースのキャッシュはこれらは数 CPU クロック サイクルでアクセスでき、次に DRAM ベースのメイン メモリには数十から数百クロック サイクルでアクセスできます。
3. シングルスレッド
まず、シングルスレッドの簡略化されたアルゴリズムの実装、同時データの構造実装難しいだけでなく、テストも面倒です。第 2 に、シングル スレッドは、スレッドの切り替えとロックのロックと解放による消費を回避します。サーバー側の開発では、ロックとスレッドの切り替えは通常、パフォーマンスの低下につながります。もちろん、シングルスレッドにも欠点があり、それは Redis の悪夢でもあるブロッキングです。コマンドの実行が長すぎると、他のコマンドがブロックされます。これは Redis にとって非常に致命的であるため、Redis は高速実行シナリオ用のデータベースです。
Redis に加えて、Node.js もシングルスレッドであり、Nginx もシングルスレッドですが、どちらも高性能サーバーのモデルです。
4. ノンブロッキング マルチチャネル I/O 多重化メカニズム
その前に、従来のブロッキング I/O について説明します。仕組み: 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 個のクライアント ソケットを処理します。
A 計画: 逐次処理: ネットワーク カードが原因で最初のソケットのデータ読み取りが遅い場合、ブロックされた後にすべてが台無しになります。
プラン B: ソケット リクエストごとにクローン サブプロセスを作成します。言うまでもなく、各プロセスは大量のシステム リソースを消費します。プロセスの切り替えだけでも、オペレーティング システムに十分な負担がかかります。
C スキーム (I/O 多重化モデル、epoll): ユーザーのソケットに対応する fd を epoll に登録します (実際にサーバーとオペレーティング システム間で受け渡されるのはソケットの fd ではなくデータです) fd_set の構造)、その後 epoll はどのソケットを読み取り/書き込みする必要があるかを伝えるだけで、アクティブで変化するソケット fd を処理することだけが必要になります。
この方法では、epoll が呼び出された場合にのみプロセス全体がブロックされ、顧客メッセージの送受信はブロックされません。
プログラミング関連の知識について詳しくは、プログラミング入門をご覧ください。 !
以上がRedis が高速である理由を簡単に分析します。もうすぐどこにいますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。