-
-
現地シンプルな動的な文字列
-
直接、従来の文字列C言語表現(null終端文字列)を使用しないのRedisが、命名されたシンプルな動的な文字列抽象型(シンプルな動的ストリングSDS)を作っていた、とRedisのSDSなどデフォルトの文字列表現。
Redisのでは、cは文字列値だけを変更することなく、いくつかの場所で使用される文字列リテラル文字列としてです。例えば、印刷ログ:
redisLog(REDIS_WRNING、「Redisのはバイバイ、今すぐ終了する準備ができています」)。
Redisのを修正することができ、文字列である必要がある場合は、文字列の値を表すためにSDSを使用するコマンドは、ハロー単語をMSG、クライアント上で実行され、そしてすべては、SDSで表現される場合、例えば、。
Redisの>セットMSG「こんにちは言葉」
OK
外部文字列値を格納するために使用されるデータベースに加えて、SDSはまた、バッファとして働く:AOF AOFバッファモジュール。
定義された1.sds
各sds.h / sdshdr構造は値SDSを表します。
SDSの練習はlenの空間特性を計算しないC文字列はnull文字、ヌル文字保存されたバイト1に従いました。追加のバイトのスペースを割り当てると、ヌル文字列で、SDS機能によって自動的に行われ、配列の最後に空の文字列を追加するので、空の文字列は、ユーザがSDSであるため、完全に透明です。Cは、練習の利点の文字列をNULL文字を使用すると、Cライブラリの文字列関数の機能の一部を再利用することができるということです以下の。
そして、C列差2.sds
API 3.sds大手術
-
リスト
ノードのリストは、効率的な再配置機能を提供し、シーケンシャルアクセスモードノード、及びリストの長さを調整柔軟にノードを追加または削除することができます。
高レベルの言語リスト長年内蔵ますが、C言語では、このような構造を構築していないので、Redisのは、自分のリストを作成します。
1.リストノードとリストの実現
リストの各ノードは、によって表されるadlist.h / listNode構造を使用しています。
複数listNode構造の使用のみが、リンクリストを形成するが、リストを保持するためにadlist /リストを使用することもできますが、操作が非常に簡単になります。
構造リストテーブルポインタリストの先頭、末尾テール・ポインタ・テーブル、及びリスト長カウンタを提供し、多型リストを所望の特定の機能を実装するために使用されるフリー、DUP、およびメンバーの種類と一致します。
DUP機能は、ノードリストに格納された値をコピーするために使用されます。
格納された値を解除するための無料の機能リストノード。
比較のためのマッチ関数値は、このリストのノードに格納され、さらに入力値が等しいです。
以下のように要約達成するために特性のRedisのリスト:
1複雑「PREVポインタを有する次のリストのノード、ノードの前後のノードを取得し、ノードOである(1)
2「次および前のポインタテーブルエンドノードヘッダノード点NULL、NULLするエンドポイントとしてリストにアクセスします。
3「時間計算のリストヘッダノードと終了ノードがO(1)で取得
4「時間計算のノードの数がO(1)で取得
5「ボイド*リストのノード値を格納するノードのポインタを使用して、およびDUPすることができ、自由な、一致ノード属性値3型特異的機能、ノードは、値の異なるタイプを格納することができます。
2.リストノードおよびAPIのリスト
-
辞書(マップでのJavaの同等)
辞書、また知られているシンボルテーブル、連想配列、マップ。抽象データ構造は、キーと値のペアを格納しています。
各辞書のキーはあなたが見つけると、キーに応じて値を更新することができ、ユニークです。全体のキーと値のペアを削除するには、キーに従って。
Redisの辞書アプリケーションは、データベース辞書の操作の操作に基づいて構築された検索変更する基本的な実装、付加および欠失のようRedisのデータベース辞書を使用されるような、かなり広いです。
1.実現辞書
基礎となるハッシュテーブルとして実装Redisの辞書には、ハッシュ・テーブルは、複数のノードを有するハッシュテーブルであってもよいです。ハッシュテーブル上の各ノードは、キーと値のペアの辞書を保持しています。
1.1ハッシュテーブル
Redisのハッシュテーブルは、辞書使用dict.h / dictht構造によって定義されます。
属性テーブルは、アレイ内の各要素は、ポインタdict.hアレイである/ dictEntry各dictEntry構造はキーと値のペアを保持しています。ノード(キーと値のペア)の数がある大きさの属性は、ハッシュテーブルのサイズを記録し、そして使用されるプロパティは、ハッシュテーブルを記録します。Sizemask属性値は常に同じサイズ-1、およびインデックスに置かれるべきであるハッシュキーを用いて決定されるプロパティの値です。次の図は、ハッシュテーブルは、任意のキーと値のペアが含まれていません示しています。
1.2ハッシュ・テーブル・ノード
ハッシュテーブルノードがdictEntry構造を使用して、各dictEntry鍵ペアを保持している構造を言います。
ヴァル属性はキーと値のペアを保持し、値のタイプがポインタ、UINT64、三種類INT64であってもよく、キーのキープロパティにキーを保持しています。
次のプロパティは、ハッシュテーブル内の次のノードへのポインタであり、ポインタが問題ハッシュ衝突を解決するために、ハッシュテーブルを複数のノードを一緒に接続することができます。
辞書1.3
辞書はRedisのdict.h / dictの構造によって表されます:
タイププロパティとprivdata特性が辞書の多状態のセットを作成するために、キーと値のペアの異なるタイプのためのものです。
type属性は、キーと値のペアの種類の記憶された特性に操作するためのポインタdictType各dictTypeクラスタ構造の関数である、異なるため、異なる種類のRedisのセットは、特定の機能の辞書を使用します。
privdataプロパティは、これらの特定の関数に渡されるオプションのパラメータが含まれています。
HT属性は、使用時にHT HT .rehashinx [0]リサイズ[1]になり、[0]のみ辞書HT、各用語は、通常の状態では、ハッシュテーブルを表し、二つの用語を含む配列を表します、-1のrehashinx値を焼き直しがない場合は、進捗状況の焼き直しを記録しました。
リフレッシュ:増加に伴い、キーと値のペアを減らし、あまりにも多くのキールックアップインデックスのパフォーマンスの低下につながることができ、キー配列あまりにも小さなスペースには、メモリを無駄にしています。したがって、配列のキーと値のペアの比は、両方のサイズを維持するために(負荷率によって示されます)。私たちは、テーブルに対応する伸縮をハッシュする必要があります。リフレッシュによって行わ。
拡張された動作条件を実行します。
1「サーバは、現在実行中又はbgsaveコマンドbgrewriteaof、および負荷率が1以上であるれていません。
2「サーバはbgsaveのbgrwriteaofまたはコマンドを実行し、負荷率が5以上です。
そして、問題を考える:HTは、[0]キーと値のペアの存在下で、HTは、[1] 1時間でそれを完了するために再ハッシュします。キーと値のペアの数が非常に多く、それほど大量の計算は、いくつかの時間のためのサービスのうち、サーバーを作成する場合はので答えは、十分ではありませんので、辞書リフレッシュ動作が緩やかです。次のステップ
プログレッシブ利点は、指定されたインデックスは、鍵ペアを更新する時期毎回追加および削除の辞書が検索操作を変更することです。しかし、いない時に、すべてのリフレッシュ動作の実現の条件の1時間の延長を実現しています。このリフレッシュと同じように、サーバーはユーザーの要求を処理することができます。
CRUD操作は二つのテーブル上で実行されるように、プログレッシブリフレッシュのプロセスにおいて、辞書は、[1] 2つのハッシュテーブル[0]、HT、HTを使用します。テーブルの上に指定されたキーを検索し、適切なアクションを実行し、その後、別のテーブルを見つけるために行ったことはできません。
辞書操作のAPI:
-
ジャンプ台
ジャンプテーブルは、高速アクセスを達成するように、ノードポインタ内の他のノードへの複数のリンクによって維持される順序付きデータ構造であります
ジャンプテーブルは、バッチ処理ノードは、バッチ操作であってもよい、平均O(logN個)、最悪のノードの複雑さO(N)のルックアップをサポートします。
ほとんどの場合、ジャンプやバランスシートの効率がツリーに匹敵する、とシンプルなので、することができ、そのジャンプテーブルとツリーのバランスをとるための場所で多くのプログラムがあります。
注文通りの要素の数を含むより多くの順序集合は、順序集合の比較的長い文字列のメンバーまたは要素が時にジャンプテーブルを使用する場合はRedisのは、キーの順序集合の一つの基礎となる実装として使用されるテーブルをスキップ基になるコレクションの実装。
位置決めジャンプテーブルヘッダとタイムテーブルの複雑さO(1)の端、テーブルルックアップの長さの時間の複雑性をスキップはO(1)
ヘッダ長(ホップテーブル長)およびレベル(最大壁ジャンプテーブル)範囲を計算されません。
1.ジャンプテーブルの実装
2.レイヤ
レベルジャンプテーブルアレイは、他のノードへのポインタを含む各要素を複数の要素を含むことができる層のプログラムは、一般に、層を介して他のノードへのアクセスをスピードアップすることができ、より多くの、他のアクセスノードの高速化。
アレイのサイズは、べき乗則(小さいのより多くの発生確率)に応じて、新しいホップ・テーブルを作成するために、各ノードは、プログラムが、この大きさを1と32介在レベルとの間の乱数を生成しなければなりません高い数値です。
3.フォワードポインタ
エンドノードの方向からテーブルにヘッダをアクセスするために使用されるフォワードポインタは、図では、プログラムは、すべてのノードの点線経路によってヘッダトラバーサルテーブルフッターにジャンプを示しています。
4.スパン
スパンを2つのノード間の距離を記録し、ゼロで前方ポインタヌルスパンを指します。
すべての層がスパンノードのルックアップまで追加スパンを訪れた道に沿って、プロセス内のノードを検索します。
5.バックポインタ
異なる高度ポインタと、テーブルを第一方向のテールからノードにアクセスするために使用される逆方向ポインタは、複数のノードをスキップすることができ、各ノード後方ポインタが一つだけ、それことができる唯一のバック前のノードに有しています。
6.スコアとメンバー
ノードスコアが倍精度浮動小数点型で、テーブル内のすべてのホップ数は、サイズスコアに従って昇順です。
ターゲット・ノードのメンバーは、文字列オブジェクトへのポインタです。
オブジェクトの各ノードに格納された同一のホップテーブルに異なっている必要があり、それらは同じ値、オブジェクトのより小さいメンバーをソートするために、対象部材のサイズに応じて辞書内のノードに同じ値であってもよいです私たちは前に立っされます。
テーブルAPIを移動:
-
整数
基本的な実装は、セットのみ整数要素を含むキーの組、及び要素の少数の整数の一つであり、整数Redisのキーセットの基礎となる実装として使用されます。
1.整数の集合の実現
コンテンツは、数値、要素の大きさに応じて昇順に前記各要素であり、重複する要素を許可しません。
代表encodeing要素型の配列の内容
長さは、配列の内容の長さを表します。
2.アップグレード
私たちは整数の集合に値を追加すると値の型が整数型の値よりも追加した場合、長さは今より長く設定しているとき。整数は、新しい要素を挿入し、アップグレードされた(新たに挿入されたタイプと同じタイプに昇格された型のすべての要素の集合)する必要があります。
3つの段階に分けて追加します
1「拡張整数:新しい要素(要素* + 1の数の元の型整数の長さ)は、アレイの新しい種類の長さの和です。
2「整数の元のセットは、新しい適切なインデックス配列に各素子は、第1の元の配列の最大数、置く(新た要素タイプの元の長さよりも大きい挿入、新規の数と種類長番号または(正の数として)すべてのオリジナルセットの数よりも多い、またはすべての数値(コレクション内の負の要素として未満挿入))、数が正であれば新たに挿入され、その後に元の配列の最大数を最後から二番目の配列に新しいインデックス。新たに挿入された数が負である場合には、インデックスが順次適切な位置に移動され、アレイ内の元の要素の元の配列要素の降順に、最後の位置です。
3「最後に、最前または最後尾の配列に新しい要素(端において正)。
注意:整数の集合は、ダウングレードをサポートしていません。整数の集合に存在する高データ・タイプの長さが削除されると、整数型の長さが設定され、したがって低減されません。
3.アップグレードのメリット
私たちは通常、データ構造に同じ長さの異なる種類の数を満たしていないので1」、前のデジタルストレージのデータ型を変換しないようにするために、我々は簡単に設定し、自動的に整数型に変換するために私たちを助けることができます。
2「整数の集合は、データ型変換のためにではなく、低長データタイプを格納するために大きなメモリ空間を開く最初に、必要な場合に行うことができます。そうすることでメモリを節約できます。
APIは、整数の集合であります
-
パッキングリスト
圧縮のリストはRedisのメモリを節約するために開発され、データ構造は、特にその符号化されたメモリの連続ブロックの連続シリーズです。圧縮のリストは、任意の数のノード(エントリ)を含んでもよく、各ノードはバイト配列または整数値を格納することができます。
1.構成するノードのリストを圧縮します
previous_entry_length、enconding、三つの部分の内容によって各圧縮ノードリスト。
1 "previous_entry_length
バイト単位でこのプロパティ、前のノードのレコードのバイト長。のみ1バイト5つのバイトかもしれません。
長さは、前のノード254バイト未満である場合には、属性の長さは1バイトです。ノード前Ruoguoの長さがより大きいかまたは254バイトに等しくなる前に、このプロパティの値は5バイトの長さは4つのバイトを格納するために使用した後に、最初のバイトは、0XFE(254)に設定されていますノードの長さ。
このプロパティは、前のノードの長さを記録し、そのため、プログラムは、現在のノードの先頭アドレスを経由して、次のノードの開始アドレスを計算することができます。
2「エンコーディング
この属性の値が記録されたコンテンツデータの種類や長さであります
3「コンテンツ
このプロパティの値は、ノードの値を格納する責任があり、ノードはバイト配列または整数であってもよいです。
上記のように、符号化はコンテンツの長さ00001011. 11で表される、符号化コンテンツが整数11000000 16_int型として表現されます。
2.チェーンを更新
チェーン更新の発生:
ノードを追加する前に、E1のPrevious_entry_length値は、1バイトです。新たに追加されたノードの長さが254バイトよりも大きいので、ノードを追加した後、しかし、長previous_entry_length e1の拡張属性は、5バイトです。しかし、プロパティ値のE2 previous_entry_lengthノードにつながる以上254バイトのノードE1の全長は、また共感EN、5バイト、E3、E4となります。これは、更新の連鎖につながりました。
空間Nの再配置動作リストの圧縮を行う最悪の場合にチェーンを更新する必要があり、各空間再配置最悪時間計算量はO(N)であるので、最悪の時間複雑度はO(ある鎖更新するようN)
チェーン更新時間の複雑性は高いが、確率は非常に低いですが。圧縮されたリストのノードの状態250 253バイトとの間の連続した長さの正確複数を満たすために、更新チェーンが発生する可能性があります。チェーンは、少数のノードを更新したり、それがパフォーマンスに影響を及ぼします。
圧縮APIリスト