Redisの基本はじめに

まず、Redisのを理解します

1. Redisのは何ですか?

(1)Redisのは、データベース、キャッシュ、およびメッセージング・ミドルウェアとして使用することができるシステムのメモリに記憶されたデータ構造、オープンソース(BSDライセンス)です。これは、(このような文字列(文字列)、ハッシュ(ハッシュ)、リスト(リスト)、セット(セット)などのデータ構造の複数の種類をサポートし、(セットをソート)のコレクションを注文し、範囲クエリ、ビットマップ、hyperloglogsと地理空間インデックスクエリの地理空間)の半径。Redisの組み込みのレプリケーション(複製)、LUAスクリプト(Luaスクリプト)、LRU駆動イベント(LRUエビクション)、トランザクション(取引)とディスクの永続性(永続性)の異なるレベル、およびRedisのセンチネル(センチネル)および自動パーティションによって(クラスタ)ハイアベイラビリティ(高可用性)を提供します。

(2)Redisのはまた、永続的なログメモリのタイプ、キー値データベースに基づいて、多言語APIを提供し、ANSI C、サポートネットワークで書かれたオープンソースです。2010年3月15日からは、Redisの開発作業は、VMwareが主催しました。2013年5月からは、ピボタル主催のRedisの開発を始めました。

(3)のRedisは、キーと値のストレージシステムです。ハッシュ(ハッシュタイプ) - と同様にMemcachedのは、文字列(文字列)、リスト(一覧)、SET(セット)、ZSET(順序集合ソートセット)を含む、比較的保存された値の型をサポートしています。これらのデータ型は、プッシュ/ポップ、追加/削除し、交差点や労働組合に、その差豊かな操作をサポートしており、これらの操作はアトミックです。これに基づき、仕分けの異なるさまざまな方法をサポートするのRedis。memcachedのと同じように、効率性を確保するために、データはメモリにキャッシュされています。Redisの差は、定期的にディスクに書き込まれたデータで更新されたり、追加のログファイルを書き込む動作を変更するために、そしてこれに基づいてマスタースレーブ(マスタとスレーブ)の同期を実現します。

(4)Redisのは、キー値の高性能データベースです。かなりの程度までが表示されますが、そのようなmemcachedのキー/値ストアの不足を補うためのRedis、それはいくつかの状況では、リレーショナル・データベースへの非常に良い補完を再生することができます。それは非常に使いやすい、ジャワ、C / C ++、C#、PHPやJavaScript、Perlやオブジェクト-C、Pythonの、ルビー、アーランや他のクライアントを提供します。

(5)Redisのマスター・スレーブの同期をサポートします。データは、サーバが別のサーバからプライマリサーバに関連付けることができる、サーバからプライマリサーバから任意の数に同期させることができます。これは、ツリーRedisの単一の実行可能コピーすることができます。意図的にまたは意図せずに、データの書き込み動作を保存することができます。パブリッシュ/サブスクライブ機構の完全な実装ので、そうツリーの任意の場所からデータベース同期は、チャネルにサブスクライブし、完全なメッセージマスタサーバ公開レコードを受け取ることができます。読み取り操作のための便利な同期の拡張性と冗長データ。
(6)は、公式ウェブサイトのアドレスは、非常に簡単に覚えておくべきであるRedisのredis.ioです。現在、VMware社が開発と保守の資金調達にプロジェクトをRedisの(特別には、国家が所有するドメイン名サフィックスIOドメイン名は、イギリス領インド洋地域、すなわちイギリス領インド洋地域で、チェックします)。

2.なぜ、Redisのを使うのか?

パフォーマンスと同時実行性の2点から:

私たちの日常のJava Web開発では、すべての一般的なシステムタスクのために、データの格納にデータベースを使用している一般的に、高い同時実行の場合には存在しません
、これは問題ないようですので、それは大量のデータに来るときそのような場面を購入するなど、いくつかの商品の需要、または家庭訪問モーメントも大きく、
なぜならディスクが直面している問題の店舗システムのデータへのシングルユースデータベース、ディスクの読み取り/書き込み速度が比較的遅く、深刻なパフォーマンスの問題点、インスタント要求の数千人が入ってくる、
非常に短時間での読み取り/書き込み操作の何千ものシステムを完了する必要があり、より頻繁にデータベースに耐えることができないよりも、この時点では、データベースシステムは、原因の麻痺に非常に簡単です
、最終的にサービス一顧をリードします深刻な生産上の問題マシン。

そのため、大規模な同時の場合には、すべての要求は、データベースに直接アクセス、データベース接続が異常な表示されます。今回は、最初の要求のRedisへのアクセスではなく、直接データベースにアクセスするようにすることを、Redisのにバッファ動作を使用して行う必要があります。
ここに画像を挿入説明
特長:

純粋メモリ動作
コアは非ブロッキングIO多重化メカニズムに基づいている
シングルスレッドが、マルチスレッド問題を切り替える、頻繁なコンテキストを避けます

差3.sqlとのNoSQL

(1)コンセプト

SQL(構造化照会言語)データベースは、リレーショナルデータベースを参照します。主な代表者:SQL ServerやOracle、MySQLの(オープンソース)、PostgreSQLの(オープンソース)
のNoSQL(未のみSQL)は、非リレーショナルデータベースを参照します。主な代表者:MongoDBの、Redisの、CouchDBの

(2)との差
ストレージ

SQLデータテーブルは、特定の構造の存在とのNoSQLは、より柔軟でスケーラブルなストレージは、JSON文書、ハッシュテーブルまたは他の手段を保存することができています。
SQLは、典型的には、データベーステーブル形式でデータを格納します

リレーショナルデータテーブル/データセット

SQLテーブルおよび構造のフィールドにデータを追加するためにはそのような定義のテーブルの主キー(主キー)、インデックス(索引)、トリガ(トリガ)、ストアドプロシージャ(ストアドプロシージャ)など、定義されなければなりません。テーブルの構造は、更新後に定義することができるが、比較的大きな構造変化がある場合、それはより複雑になります。
NoSQLのでは、データが追加していつでもどこでもすることができ、あなたは、テーブルを定義する必要はありません。
NoSQLのは、インデックスデータを集中管理することができます。MongoDBのでは、例えば、自動的に、データセットを作成した後、独自の価値_idフィールドを作成し
たデータセットを作成した後、あなたが率を高めることができるように。
この観点プロジェクトから、NoSQLのは、より適切な初期化データであってもよい不明瞭か未定です。

外部データストレージ

それに関連付けられた外部SQLデータを増やす必要があるためにどのように、標準化されたアプローチは、元のテーブルの外部キー、関連する外部データテーブルを追加することです。
標準化された外部データ・テーブル・アプローチでは、このNoSQLのに加えて、我々は直接クエリのパフォーマンスを向上させるための非標準化された方法で設定された元のデータに外部データを置くことができます。

SQLクエリで登録しよう

あなたは、SQLは、単純なクエリとクエリ実行で複数のリレーショナルデータテーブルからテーブルの連鎖データをJOINを使用することができます。
NoSQLのはまだ同様の提供は、クエリのデータの複数のデータセットに対してクエリを登録しよう。だから、ほとんどのNoSQLデータストレージストアデータへの非標準化された方法を使用して。

データ結合

SQLは、データの整合性を確保するために使用されている外部データを削除することはできません。NoSQLのは、強力なカップリングのこの概念を持っていない、あなたはいつでも任意のデータを削除することができます。

業務

大量のデータを持つ複数のSQLテーブルを更新する必要がある場合は1がテーブル他のテーブルを更新するために失敗した場合、つまり、正常に更新することはできません。
このシナリオでは、トランザクションによって制御することができ、トランザクションはすべての後に完了するために統一することができますコミット。
この概念は、NoSQLの取引ではありません。しかし、各データセットの操作が原子レベルです。

クエリパフォーマンス

前提の下で、システム設計の同じレベルのNoSQLは、クエリのJOIN消費省略しているため、それは理論的には、より良いSQLの性能を超えています。

4.redisアプリケーションシナリオ:

(1)は、データをより効率の読み書き、メモリの中の動作と読み出し動作をするので、それは多くの場合、キャッシュされたデータのために使用されるのRedis。一部のデータが頻繁にアクセスする必要がありますが、操作中のRedisを入れて、短い時間で変更されません。これにより、速度を改善し、読み取りの数を減らし、ユーザーの負荷要求サイトを削減し、データベースを作成し、データをキャッシュに入れます。

(2)いくつかの一般的には、リアルタイムシステムを備えています。必要リアルタイムの変化や表示機能は、あなたは、動作中のRedisの上にデータを置くことができます。効率を大幅に向上させます。

(3)メッセージ・キューは、しばしば大幅にアプリケーションの可用性を向上させる、ライブチャットシステムのような機能を構築するために使用されています

5.Redisイベントメカニズム

ネットワークIOを大量に処理するためにイベント駆動型のメカニズムを使用してのRedis。
Redisのイベント駆動型のWeb IOだけに焦点を当て、ライブラリ、およびタイマー。イベントライブラリには、イベントには、次の2種類を処理します。

イベントファイル(ファイルイベント):サーバーとクライアントの間でハンドルネットワークIO Redisのに使用。
イベントの時間(時間eveatは):Redisのサーバ(例えば、機能serverCronなど)いくつかの操作は、時間実行の所定の時点で必要であり、時間イベント処理はこのような動作のタイミングです。

aeEventLoop(イベントマネージャ)は、全体のイベント駆動型、イベントとイベントテーブルの時間、のファイルリスト管理の中核である
イベント対応のファイルとによるイベントの時間と連続サイクル処理を。

(1)イベントハンドラを文書化

Redisのベース原子炉パターンは、ファイル・イベント・ハンドラで独自のネットワークイベントハンドラを開発しました。異なるソケットに関連するイベントに対して複数のソケットとハンドラを監視しながら、多重化技術を使用してIOイベントハンドラをファイル。ソケットが読み取り可能であるか、書き込み可能なイベントがトリガされると、それは適切なイベントハンドラを呼び出します。

技術を多重RedisのIOが主に使用:、選択のepoll、kqueueのevportなどが挙げられます。

、ファイルイベントハンドラは、ソケットであり、以下に示すように、4つの成分を有するI / Oプログラム、ファイル、イベントとイベントディスパッチャプロセッサを多重化。ここに画像を挿入説明
①redis反応器モデルは、ネットワーク・イベント・プロセッサの開発に基づいており、このプロセッサは、ドキュメントイベントハンドラ(ファイルイベントハンドラ)と呼ばれます。このファイルは、イベントハンドラはシングルスレッドなので、このイベントを処理するためのソケットの時間に応じて対応するイベントハンドラを選択し、それは同時に複数のソケットを監視するために、IO多重化メカニズムを使用して、シングルスレッドモードと呼ばれているのRedis。

②リスニングソケットが受け入れる実行のための準備ができている場合は、読み取り、書き込み、近くの他の操作に対応するファイルイベントで動作が以前この時に生成されるときは、これに対処するための良いイベントハンドラに関連するドキュメントプロセッサを呼び出します。イベント。

③ファイルイベントハンドラは、高性能ネットワーク通信モデルを達成することができ、シングルスレッドモードが、複数のソケットを多重IOの機構を介して聴取している、と保証するために、他のシングルスレッドの内部モジュールとドッキングすることができ、内部のRedisスレッドモデルのシンプルさ。

ソケットは、複数のIO多重化プログラム、ファイル・イベント・ディスパッチャ、イベントプロセッサ(プロセッサコマンド要求、応答コマンドプロセッサ、プロセッサ接続応答、など)④イベント構成ファイルプロセッサは、4つの部分から構成され。

⑤ソケット複数のそれぞれ異なるイベント・ファイルに対応し、異なる同時動作を有することができるが、プログラムは、ソケットを多重IO複数を監視しますが、ソケットは、各キューから、プロセスにキューに配置されますソケットにイベントディスパッチャを削除し、ソケットイベントディスパッチャプロセッサは、イベントに対応します。

イベントのソケットが完成し、処理された後⑥その後、IO多重化プログラムは、イベントディスパッチャの隣のソケットのキューになります。現在生成されたソケットに基づいて、各イベントのイベントディスパッチャは、対応するイベントハンドラは、ハンドルに選択されています。

(2)ファイルイベント
ここに画像を挿入説明
Redisのように、図に示すように、コマンドやプロセスを送信するための接続クライアントとサーバ。

クライアントがサーバーへのソケット接続を確立するための要求を送信し、その後、リスニングソケットがAE_READABLEイベントが生成されます、接続がトリガされた応答処理です。プロセッサは、クライアントの接続要求の応答で、その後、クライアントソケット、およびクライアントのステータスとコマンド要求しているプロセッサに関連付けられたクライアントソケットAE_READABLEイベントを作成します。

クライアントが接続を確立した後、サーバーにコマンドを送信し、クライアントソケットを要求するコマンドプロセッサをトリガ、AE_READABLEイベントが生成されます、プロセッサは、クライアントコマンドを読み込み、その後、関連するプログラムの実行に渡されます。

対応するコマンド応答を取得するためのコマンドを実行し、クライアントに渡されたコマンドに対応するために、サーバ・クライアントは、コマンド応答処理に関連付けられているAE_WRITEABLEイベントをソケット。コマンド応答を読むために、クライアントの試み、クライアントのソケットがAE_WRITEABLEイベントを生成すると、プロセッサはコマンドがソケットに書き込まれたすべてのコマンドを返信返信トリガされます。

(3)タイムイベント
Redisの時間のイベントは、次の2つのカテゴリに分類されます。

時限イベント:指定した時間後に一度実行するプログラムを作ります。
定期的なイベント:すべての指定した時間のプログラムを一度に実行されるようになっています。

6.redisねじ切り+多重I / Oモデルを多重化

それはRedisのシングルスレッドモデルと呼ばれるように、内部で使用するファイルイベントハンドラのファイルイベントハンドラをRedisの、イベントハンドラファイルは、シングルスレッドです。
これは、ソケットのイベントに応じた処理のために、対応するイベントハンドラを選択するために、IOマルチプレクサ機構同時にリスニングソケットの複数を使用しています。

シングルスレッドモデルは、データストレージの病気を解決するために:データの同時実行セーフ、なしで実行複数のスレッドが同時にこの問題を抱えることになりますデータベースにアクセスするので、表示されないデータの同時実行性を確保するためにMySQLのMVCCとロック、MemcachedののCAS楽観的ロックを持っていますデータの問題が発生しますが、この問題はありませんシングルスレッドを使用してのRedis:1を、両方の実現Redisの中または発信者として、簡単な十分なシングルスレッド、あなたは同時データ、ロックなしの恐怖の中で生活する必要はありません。2.不要なスレッドのスケジューリングを表示されない、マルチスレッド、あなたが知っている、頻繁な切り替えコンテキストは、パフォーマンスのオーバーヘッドの多くをもたらすでしょう

コンテキストを切り替えることは何ですか?

競争マルチタスクCPU、CPU変換タスクのコンテキストスイッチ時にCPU(コンテキスト・スイッチ)。呼び出しをトリガーすることにより、ハードウェア信号のプロセス、スレッド、または原因の中断:CPUのタスクは、4つの方法があります。
タスクスイッチは、タスクは、コンテキストのコンテンツである次のタスク(ポインタ)の情報と、アドレスに現在の状態とのアクセスを記録する必要がある場合。したがって、コンテキストは、CPUレジスタの内容に時点(CPUレジスタ)とプログラムカウンタ(PC)を指し、また広くマッピング情報の過程で仮想メモリアドレスを含みます。

コンテキスト切り替え処理:

(1)記録し、現在のタスクのコンテキスト(すべての状態の、すなわち、レジスタおよびカウンタ);
(2)新しいタスクのコンテキストを見つけてロードする;
(3)は、そのタスクを復元するために、新しいタスクプログラムカウンタ位置に切り替わります。

タスクの実行の形、上記下で対応するスイッチによれば、プロセスコンテキストスイッチがあり、スレッドコンテキストは、三つのカテゴリーを切り替える割り込みコンテキストを切り替えます。

プロセスとスレッドの違い:

プロセスは、リソース割り当て及び実行の基本単位であるスレッドがタスクスケジューリング及び実行の基本単位です。スレッドは仮想メモリ、スタック、変数やその他の共有リソースを処理するためのポインタを提供するためのリソースを持っていない、とのスレッドがリソースのプロセスを共有することができます。

ハンドオーバ処理のプロセスのコンテキスト:

()プロセスを中断するスイッチング信号を受信し、仮想メモリは、メモリ・スタックなどのリソース、現在のプロセスを記録し、
(B)CPUのプロセスのコンテキストでの状態をその中に格納されている。
©、メモリ内の次のプロセスを取り出しますコンテキスト;
(D)とCPUの回復のレジスタにロードされ、
(E)は、仮想メモリとユーザ・プロセス・スタックをリフレッシュする必要があり、
(F)プログラムカウンタの最後の位置にジャンプするプロセスを回復するために指摘しました。

スレッドコンテキストの切り替え:

(1)間のプロセスは、プロセスが実質的に同じである、スレッドコンテキストスイッチとは異なり、プロセスコンテキストスイッチ。
スレッド(2)切替のプロセスのコンテキスト内。プロセスを切り替えることなく、ユーザーのリソースは、スイッチのみスレッドプライベートデータとレジスタにする必要があります。このプロセスは、それほどマルチスレッド、マルチプロセスの利点に比べて、より少ない消費資源を切り替えるプロセスコンテキストよりなります。

割り込みコンテキストの切り替え:

ハードウェアイベント、スケジューリングと通常の実行プロセス割り込みへの迅速な対応は、プロセスを中断します。同じCPU、プロセスよりも高い優先度の割り込みのハードウェア。プロセスの切り替えは、ユーザの実行状態のリソースを含まないシステムコールに似ています。しかし、同じ割り込みコンテキストスイッチの多くは、パフォーマンス上の問題を引き起こす可能性があります。

複数のI / O多重化モデルは、使用IOモデルは、アクセスのRedisへのリクエストは、リクエストに返されるデータを整理するためのRedis後にするとき、それは意味し、また、多くのIOモデルのlinuxの1のJava NIOシステムであり、この時間は、要求のRedisの入り口がブロックされていない、他のストリームは、呼び出し元に戻りデータの前に完了しているioのRedisの後、この方法は、単一のスレッドが速度に影響することを恐れなくなるまでRedisの要求に要求を送信し続けることができ
、この「マルチロード「複数のネットワーク接続を指し、
同じスレッドを再利用するために参照する」マルチプレックス」
私たちはシングルスレッドのマルチコアCPUのパフォーマンスを使用する方法がプレーすることができませんが、私たちは完璧に単一のRedisの複数のインスタンスを開くことができます

公開された130元の記事 ウォンの賞賛1 ビュー2471

おすすめ

転載: blog.csdn.net/qq_36417677/article/details/104896578