RedisのIO抽象化レイヤ
Redisのその、Redisのは抽象化層、すなわち、異なる基礎となるIOへリオライトデータを使用して実装することができるリオが、同じインターフェースを設計する動作を統一するために、そのようなファイルやソケットのように、より多くのIOを含みました。rio.cとソースファイルに実装リオrio.hは、ソケットが3つの基礎となるIOを設定し、メモリ、ファイルをサポートしています。
1.構造体リオ
構造体リオは、IO統一されたユーザーインターフェイスを宣言、及びオブジェクトioの底構造の組合を含みます。すなわち、基礎となる実装に対応するIOリオ抽象インタフェースコールを呼び出し、異なる基礎となるIO初期化リオインスタンスを使用。、三つのサブカテゴリーがあるリオ抽象クラスで、オブジェクト指向の考え方:バッファ、ファイルおよびfdsetは、三つのサブクラスは、インタフェース、抽象クラス宣言を実装しています。ユーザーは、ポリモーフィズムを実現するためにプログラムされ、親リオを使用することができます。
以下は、(他のメンバーの数を省略)構造体リオ抽象インタフェース宣言です。
構造体_rio { / * バックエンド機能。 *この機能は、短い書き込みを容認またはリターンを読み取っていないので、 完全な成功にエラーにゼロ、非ゼロ:*値は次のように単純化されます。* / size_tの( *読み込み)(構造体 _rio *、無効 * bufは、size_tのLEN)。 size_t型( *書き込み)(構造体 _rioの*、constの 無効 * bufは、size_tのLEN)。 off_t型( * TELL)(構造体 _rio * )。 int型(*フラッシュ)(構造体 _rio * )。 / * update_cksum方法ではなくNULLがのチェックサムを計算するために使用されている場合 *読み取りまたはこれまでに書かれたすべてのデータ。方法はする必要があります *それは、現在のチェックサムを呼び出すことができるよう設計されており、BUF *チェックサムに追加するデータの新しいブロックを指すLENフィールド *計算。* / ボイド(* update_cksum)(構造体 _rio *、CONST ボイド * bufは、size_tのLEN)。
...
/ * バックエンド固有のVARS。* /
... };
基礎となるオブジェクトの各々は、ボトムIOの構造を達成するために、リオ、リオ関数ポインタポイントをインスタンス化するとき、インターフェイスをサポートする必要が実装する必要があります。下の3つのIOのための3つの対応する初期化関数を宣言してRedisのは、C言語です。
空 rioInitWithFile(リオ* R、FILEの*のFP); 空 rioInitWithBuffer(リオ* R、SDS秒)。 空 rioInitWithFdset(リオ* R、int型 * FDS、INT numfds)。
これら3つの関数が関数ポインタがオブジェクトの下にあるioの正しい初期化組合構造にその対応する抽象インタフェース、およびポイントのリオ例を初期化されています。
注:なお、リオ・インタフェースは書き込み動作と読み出し動作を宣言したが、Redisのは一方向のみの動作、すなわちリオインスタンスまたは書き込み動作の使用、または読み出し動作の使用のためにそれらを使用し、同一のリオ・インスタンスが両方の読み書きができません。
2.バッファ
底IOとしてバッファへリオ・インスタンスは、SDS中(文字列がRedisのを達成する)BUFパラメータにコピーするデータの操作を書き込みます。逆に、尖っSDS BUFアドレスパラメータのいずれかからデータを読み出す読み出し動作をします。
抽象インタフェースは、書き込みのみ追加することができますので、唯一の現在の位置からデータを読み取ることができる読み取り操作、シーク動作をサポートしていません。次のように構造宣言バッファオブジェクトがあります。
/ * インメモリバッファターゲット。* / 構造体{ SDS PTR; POS off_t型; }バッファと
読み取りおよび書き込み操作のPOSは、現在のバッファ位置に記録されています。
3.ファイル
基礎となるIOとしてファイルにリオ・インスタンスは、ファイルへのデータファイルをBUFパラメータの書き込みデータの書き込み動作を、メモリアドレスを読み出すために読み出し動作さBUFパラメータで指されます。抽象インタフェースのファイルオブジェクトの実装は、単純に、C言語のライブラリ関数を呼び出します。
シーク動作が抽象インタフェースを宣言されていないため、また、その具体的な実装では、シーク動作を実装していません。次のようにオブジェクトファイル構造の宣言は次のとおりです。
/ * 標準入出力ファイルポインタのターゲット。* / 構造体{ FILEの *のFP; off_t型バッファリング; / * 最後にfsync以降に書き込まれたバイト数。* / off_t型自動同期。/ * 書かれた「自動同期」バイトの後にfsync。* / }ファイル。
ここで値がオートシンク緩衝値を超えたときに蓄積されたデータの書き込み動作、およびオートシンクの量は、同期値を設定するレコードをバッファリングし、ディスク上のデータを同期させるために同期操作を実行する、ゼロに緩衝値の後に同期動作を制御します。
4. fdset
Redisの中Ioが複数のターゲットに同時にデータを書き込むことができる下地fdsetのリオのような例としては、主に書き込み動作の使用は、ソケットの複数のデータをfdsetことができる、すなわち、同期データ伝送のその複数のマスタスレーブとして使用します送信されました。抽象fdsetが大きく、そのマスター同期データ送信にスレーブのRedisの複数の入出力操作を簡素化
fdsetは、読み出し動作をサポートしていません。また、同様の例では、バッファとしてのバッファをSDS使用し、データは最初に、キャッシュにデータが一定数を超え、又はフラッシュ動作を呼び出し、キャッシュ書き込まれるソケットの全てと、データキャッシュに送られますインチ 次のようにFdset構造の宣言は次のとおりです。
/ * (Nソケットへの書き込みに使用される)複数のFDターゲット。* / 構造体{ INT * FDS。 / * ファイル記述子。* / int型 *状態。 / * 各FDのエラー状態。0(OKの場合)またはerrnoを。* / int型numfds。 POS off_t型; SDSのBUF。 } Fdset。
、状態はこれらのファイルディスクリプタ(書き込みエラーかどうか)の状況を記録し、numfdsコレクションのサイズを記録しているすべての設定した目標ソケットファイルディスクリプタ、bufはバッファであり、posは次のデータBUFを表しFDSを送信する必要があります場所。