機能の独立性
1.パブリッシュおよびサブスクライブ
そのような組成物として、サブスクライブ、パブリッシュpsubscribeコマンドによってパブリッシュおよびサブスクライブ機能のRedisの
クライアントは、1つまたは複数のチャネルにサブスクライブ
> SUBCRIBE " news.it " " news.etは、" // 二つのチャンネルにサブスクライブ
クライアントは、チャネルにメッセージを送信します
>公開「news.itを」 「こんにちは」 // news.itチャネルにハローメッセージを送ります
クライアントは、helloメッセージを受信するチャンネルを購読news.it
クライアントは、1つまたは複数のパターンを購読します
> Psubscribe 「ニュース。* 」 「ブック。* 」 // 相当するものは、すべてのチャネルのいずれかに二つのモデルと一致するようにサブスクライブします
クライアント退会チャンネル
>退会" news.sport "
クライアントモード退会
> punsubscribe " ブック。* "
2.原則として、チャネルサブスクリプション
クライアントは、コマンド、クライアントとの関係の確立に加入チャネルを購読行う場合。この関係は、サーバの状態で保存されている辞書をpubsub_channels。
加入チャネルのための辞書のキーは、辞書には、クライアントサブスクリプションのチャネル内のすべてのレコードのリンクリストです
サブスクリプション・チャネル
、チャネルが第1の加入者であるかどうかに応じて異なる処理
図1は、キー(文字列オブジェクト)に対応するチャネルを作成する第1の加入者であり、キーが空リスト構造に設定し、リストにクライアントを追加しています。
ていない第1の加入者2は、キーが既に存在し、その値に対応するリスト構造体の端に直接添加しました。
場合解除チャネル
、最後の加入者かどうかに応じて異なる処理
1、最後の加入者である、辞書にチャンネル対応するキーを削除していき、退会クライアントを削除
図2は、ではない最後の加入者、構造体は、キーに応じた値チェーンに直接対応し、クライアントが削除解除でき横切ります
原則モードを購読
サーバの状態に保存されているpubsub_patternsリストサブスクリプション・リレーションシップ・モデル
各ノードは、リンクリストpubsub_patterns構造pubsubPatternが含まれています
pubsubPatternパターン構造は、属性とクライアント属性が含まれています(この2つのプロパティは、単純な文字列で構成、またはその両方が一緒に文字列オブジェクトであるされています?)
サブスクリプションモデル
パターン属性モードに対応するように設定された新しい構造を、PubsubPattern、クライアントの属性は、加入者に設定し、テーブルのpubsub_patterns端の現在のリストに追加しました。
登録解除モード
モードを解除する属性、クライアントのプロパティpubsubPattern構造の人物を解除することができ、パターンを探します。
メッセージフローと原理を送ります
>公開<チャンネル> <メッセージ> // チャネルのチャネル
1、チャンネルの登録者のすべての加入者にメッセージを送信
原則は:クライアントに対応するリスト構造内の値に応じて対応するキーpubsub_channels辞書を検索し、順次メッセージを送信します
図2に示すように、チャネルは、メッセージが所定のパターン加入者と一致する送信します
原理:pubsub_patternsリストトラバーサルのすべてのチャネルパターンマッチングを見つけるために(パターン属性)、およびそれに対応するクライアントにメッセージを送信する(クライアント属性)
三つのサブコマンドの表示のpubsubサブスクリプション情報
> PubSubのチャンネル[パターン] // 制限を一致させるために使用できるオプションのパラメータ内で現在加入して全チャンネル、[]のためにサーバーを照会 >のPubSubのnumsub [CHANNEL1 CHANNEL2 ...] // これらのチャネルへの加入者の数を返しますが、つまり、加入者のキーに対応する長さの値のリスト構造は >のpubsub numpat //は、現在のモードがサーバー・サブスクリプション番号を返し、すなわち、リストの長さがpubsub_patternsを返さ
3.トランザクション(トランザクション)
コンセプト:1つ以上のコマンドは、その時間の後、統一された実行順序を詰め。
関連コマンド
モニターのトランザクションデータベースキー >ウォッチ<key_nameは> // key_nameはキーがデータベースを聞くためにある、キーがトランザクション他のクライアントの間に修正されているかどうかを判断するために使用されるデータベースは、 総務を回し > マルチ トランザクションを提出して実行 >幹部
注意:トランザクション-timeコマンドは、複数のサーバーに送信され、代わりに1を送信する、このようにパイプラインと呼ばれています。使い捨てのパイプラインは、複数のコマンドを送信し、使い捨ての実装後に結果を返すので、周波数のパフォーマンスを向上させるために、クライアントとサーバ間のネットワークトラフィックを削減し、pinelineキューに基づいて、キューはFIFO特性であることができてデータの順序を保証します。
トランザクションを実装
一般的に3つの段階に分け
1.トランザクションを開始します
マルチコマンドを使用して、実行されたコマンドは、非トランザクション状態にクライアント・トランザクションの状態から切り替えられました
フラグは、クライアントの状態が国政では、クライアントのビジネスのターンをマークするREDIS_MULTIロゴを開きます属性
2.コマンドチーム
非トランザクション状態の下では、クライアントから送信されたRedisのコマンドは、直接サーバーに実行されます
トランザクションの状態は、サーバはRedisのコマンドは、トランザクション・キューにクライアントから送信されます、そして(execを、破棄、腕時計、マルチの4つのコマンドを除く)QUEUEを返します。
各クライアントは、事務の自身の状態を持ち、状態は(FIFOキューとカウンタトランザクション数を含む、マルチステート構造)クライアントのプロパティmstateに保存されています
トランザクションキューは、各要素は、コマンド・エンキューの記憶された情報(関数ポインタ、コマンドパラメータ、パラメータの数)multiCmdアレイmultiCmdれます
回数カウンタは、トランザクションキューの長さをカウントするために使用されます。
3.トランザクションの実行
クライアントは、execコマンドを送信した後
順番にトラバーサルサーバ、クライアントのトランザクション・キュー、シングルスレッドのシリアルトランザクション・キュー内のトランザクションの実行、および各コマンドの結果がクライアントに返さ
コマンドを見ます
EXECコマンドを実行する前にコマンドは、楽観的ロックで見て、データベースは、トランザクションの確立過程における重要な変化をするかどうかを監視するために使用しました
EXECコマンドを実行したコマンドワードを見て、それが重要な変更が発生した監視するためにチェックし、変更が発生した場合、サーバは、トランザクションを拒否します。
基本となる実装
各Redisのサーバーがwatched_keys辞書を保持し、
キーは、キーが監視されている辞書データベースで、値がリンクされたリスト構造、すべての監視対象のクライアント鍵データベースのリストのレコードがあります
原則の実現
データベースサーバは(等SET、LPUSH、DEL、ZADD、など)の変更を行うためのコマンドを実行すると、キーが行った変更を監視することであるかどうかを確認する機能watched_keys辞書チェックを実施した後に呼び出される;それらはでありデータベースには、クライアント・トランザクションのセキュリティ侵害を表すために開いているクライアントのすべてのキーREDIS_DIRTY_CAS IDを監視します。EXECコマンドが実行され、クライアントは、ロゴがオンになっていることが判明した場合、トランザクションは安全ではないと考えられ、およびトランザクションを実行することを拒否され、REDIS_DIRTY_CAS判断を識別します。
ACID Redisのトランザクション
アトミック性、一貫性、独立性、耐久性
特定の場合は、永続的であろう(永続モードのAOF、及び常にappendfsyncに設定されている); Redisの総務は、原子性、一貫性、分離を有します
一貫性の概念:データ定義および違法または不正なデータエラーが含まれていないデータベースに沿って要件
(メンテナンスのエラー検出とデザイン)の一貫性を維持するために、三つの側面からのRedis
1.チームにエラー
コマンドは、間違ったフォーマットなど存在しない場合は、エラーがトランザクション中に発生したにサーバーがチームを運ぶことを拒否しながら、チームは、エラー処理を取得します
2.実行エラー
操作キーとして正しいが、コマンドが他のオブジェクト(SET操作リスト、など)を満たしていない、サーバー・エラー・コマンドが識別され、対応するエラー処理が、エラーコマンドは、データベースへの変更を行いません
3.サーバーのダウンタイム
(1)RDB、AOF永続的なメンテナンス
(2)あなたは、対応するファイルが見つからない場合、または非永続モードでは、その後、再起動したデータベースは、まだ、の要件に合致空白であります
Redisのコマンドは、1つのスレッド、シリアルトランザクションキューでトランザクションを実行するので、複数のクライアントが同時トランザクションは、まだお互いに影響を与えない場合でも
症例の大部分を維持することができない理由永続性(例えばRDB永続性の永続性、などappendfsync = everysec /いいえなぜ維持されるように)を理解します
Redisの総務従来のリレーショナルデータベーストランザクションの最大の違い
:
Redisのは、findコマンドの実行エラーが、トランザクション全体が対応するクライアントのトランザクション・キュー実行されたすべてのコマンドまで実行を継続する場合でも、トランザクション中のコマンドを実行し、(ロールバック)トランザクションのロールバックをサポートしていません。(質問はまだアトミックを満たしていませんではないでしょうか?Redisの著者は、実際の生産は表示されません。このような状況は、コンパイル・エラーがであることを信じますか?)