5つのデータ型の実装の基礎となるのRedis

簡単な紹介

Redisの5つのデータオブジェクトと呼ばれる5つのデータタイプ; 6は、Redisのは、データベースへの鍵を実装するためにこれらの構造を使用しない、以前の大きなデータ構造を説明するが、これらの構造は、対象システムのredisObjectを構築するために使用される、ターゲット・システムが含まれています5つのデータ、ストリング(文字列)、オブジェクトの一覧(リスト)、ハッシュ・オブジェクト(ハッシュ)、コレクション(集合)オブジェクトとオブジェクトの順序付けられたセット(ZSET);および5つのオブジェクトをコードする下層データは、オブジェクトを注文することができそれを表示するエンコーディング。

redisObject構造

typedef struct redisObject {
    // 类型
    unsigned type:4;
    // 编码
    unsigned encoding:4;
    // 指向底层实现数据结构的指针
    void *ptr;
    // ...
} robj;

Redisのオブジェクトがキー値ストアキーと値のペアは、2つのオブジェクト、キーオブジェクトと値オブジェクトが作成されていること、オブジェクトと値オブジェクトキーに分割されているように、キーと値のペアは、データが記憶されています。
Keyオブジェクトは、常に文字列オブジェクトで、オブジェクトの値は、5つのオブジェクトのいずれであってもよいです。

  • type属性は、我々は、ビューへのコマンドTYPEキーを文字列、リスト、ハッシュ、セット、1のZSETを使用することができると言う、つまり、オブジェクトストレージのタイプです。
  • データ構造は、基礎となる目的を達成するために使用される符号化、すなわち、によって使用される属性レコードをコードします。

ここに画像を挿入説明
出力は、基礎となるコードと定数オブジェクトエンコードコマンドに対応するテーブルのリストは、最初の3つは、文字列の構造です

私たちが堆積すると、キー値と、キーと値のペアは、オブジェクトエンコードを指定されていませんが、Redisのは、被写界を使用せずにシステムに応じて設定されます別のエンコーディング、メモリを節約するためにアップし、訪問スピードの目的アップ速度です。

Stringオブジェクト(文字列)

データ構造の基礎となる文字列オブジェクトは、単純な動的ストリング(SDS)として実装され、直接格納するが、符号化モードは、異なるメモリ構造を除く生又はembstr整数であってもよいです。

(1)INTコード

示すように、それは直接PTR属性redisObjectの、エンコードされたセットのintに格納され、文字列に格納された整数値であり、これは正式にlong型のように表すことができます。
ここに画像を挿入説明

(2)生の符号化

32より値の大きいが文字列格納されている文字列、単純な動的ストリング(SDS)構造バイト、及び生をコードする、この時間はSDS構造のメモリ構造と一致して、メモリ割り当ての倍数であり、作成redisObjectオブジェクト示すようにsdshdr構造、:
ここに画像を挿入説明

(3)符号化embstr

文字列文字列は、以下の値を保存するか、または32バイトに等しく、動的ストリング(SDS構造)を使用することも簡単であるが、メモリアーキテクチャはDunxiao格納されている文字列のために最適化され、メモリ割り当てが必要回のみ:完了することが、連続空間は次のように割り当てることができる
ここに画像を挿入説明
文字列オブジェクトの概要:

  • Redisのでは、倍精度浮動小数点型は、その後、格納されている文字列に変換され、長く記憶されています。
  • 生embstr効果をコードするembstr 1回、2回、生の、メモリの割り当てと解放ことを除いて、同じです。
  • embstrメモリの連続ブロックは、キャッシュがする利点をより有効に利用することができます
  • INTコード符号化および他の操作が行われた場合に、満たされる生コーディング状態に変換されるembstr文字列を付加し、第一変形例は、生にトランスコードされたら、オブジェクトを符号化する、読み出されるembstr。

オブジェクトのリスト(一覧)

コード化されたziplistことができるオブジェクトのリストと1つのLinkedList:バージョン3.2の前に。

(1)符号化ziplist

カプリス基底実装をコーディングziplistハッシュは、圧縮のリストであり、リスト内の各圧縮ノードは、リストの要素を保持しています。
ここに画像を挿入説明

(2)LinkedListのエンコーディング

リンクリストの実装の二重底の端をコードするLinkedListのは、ダブルエンドリンクリストのノードのそれぞれは、各文字列オブジェクト内のリスト要素を保存するには、Stringオブジェクトを保持します。
ここに画像を挿入説明
トランスコードオブジェクトのリスト:

  • ziplistコーディングの必要性を使用してオブジェクトのリストは、2つの条件を満たすように:まず、すべての文字列がより小さい64のバイトは、第二の符号化のLinkedListのいずれかを満たさない場合に使用され、要素512の数未満です。
  • デジタルの2つの条件がRedisのコンフィギュレーションファイル、リスト-MAX-ziplist-valueオプションとリスト-MAX-ziplist-エントリオプションで変更することができます。
  • 図StringObjectが挙げ文字列オブジェクトであり、唯一の文字列オブジェクトは、オブジェクト5にネストされたオブジェクトとして使用されます。

オブジェクトのエンコーディングクイックリスト:バージョン3.2の後。

クイックコーディング

クイックzipListとのLinkedListの混合物であるが、それLinkedListのプレス部は、A双方向ポインタ複数zipListとの間に直列に接続zipListはコンパクトに収納するために使用される各セグメントを、セグメント。
ここに画像を挿入説明
ここに画像を挿入説明
Redisのはziplist圧縮保管、使用LZF圧縮アルゴリズムになります、あなたは圧迫深さを選択することができます。
クイックデフォルトの圧縮深さが圧縮されていないこと、0です。圧迫の実際の深さは、構成パラメータリスト圧縮深さによって決定されます。圧縮されていない2つのziplistクイックを含め迅速なプッシュ/ポップ操作をサポートするために、その深さは1です。深さが2である場合、それは圧縮されていないziplistエンドツーエンドの第ziplistクイック端部および第2の端部を意味します。
ziplist長さ:
このバイト数は、新たな出発ziplistとなります超えて内部クイックziplist単一のデフォルトの長さは、8Kバイトです。
リスト-MAX-ziplistサイズのziplist長さは、設定パラメータによって決まります。

ハッシュオブジェクト(ハッシュ)

エンコードされたハッシュオブジェクトはziplistと1つのハッシュテーブルすることができます。

(1)符号化ziplist

ziplist符号化されたハッシュオブジェクト基礎となる実装は、リスト、圧縮密接にリンクされたリストにキーを介してziplist被験者、キー値符号化ハッシュ、テーブルの端に最初のキーを圧縮し、その後にされています値は、キーと値は、常にテーブルの最後に追加されます。
ここに画像を挿入説明

(2)ハッシュテーブルエンコーディング

ハッシュテーブルの基礎となるハッシュオブジェクトは、オブジェクトのハッシュキーと値のペアのそれぞれは、キーと値のペアを格納するために辞書を使用し、コーディング辞書達成されます。
辞書で、キーと値のペアは、辞書のキーと値は、キーと値のキー、値の格納されたキーと値の辞書の値を保存するための文字列オブジェクト辞書です。
ここに画像を挿入説明
ハッシュオブジェクトコード変換:

  • Ziplistハッシュコードオブジェクト用途は二つの条件満たす必要がある:キー値と第一の文字列の長さを、すべてのキーが64バイト未満であり、第二は、以下のキーと値のペア512の数よりも、使用して、任意の符号化ハッシュテーブルを満たしません。
  • 上記2つの条件がレイズプロファイルオプションでハッシュ-MAX-ziplist値オプションとハッシュ-MAX-ziplist・エントリを修正することができます。

オブジェクトのコレクション(集合)

オブジェクトのコード化されたコレクションは、INTSETと1つのハッシュテーブルすることができます。

(1)符号化INTSET

整数の符号化されたセットの下にあるオブジェクトのINTSETコレクションは、すべての要素が整数の集合に格納され、達成されます。
ここに画像を挿入説明

(2)ハッシュテーブルエンコーディング

実装の基礎となるハッシュテーブルコレクションオブジェクトがエンコードされた辞書で、各キーの辞書は、辞書の値がNULLであることを除いて、コレクション要素を保存するために、文字列オブジェクトであり、JavaをHashSetの構造を参照してください。
ここに画像を挿入説明
オブジェクトのコレクションをトランスコード:

  • INTSETは、オブジェクトのコレクションを二つの条件満たしている必要があり使用して符号化:まず、すべての要素の値の整数であり、第二は、以下の要素の数であるか、または512に等しい、いずれかハッシュテーブルコーディングを使用する満たしていません。
  • 以上の第2の条件は、ET-MAX-INTSET-エントリオプションRedisの設定ファイルを修正することができます。

オブジェクトの順序集合(ZSET)

エンコーディングの順序付きセットはziplistと1 skiplistすることができます。

(1)符号化ziplist

オブジェクトの順序付けられた集合は、ノードの圧縮2つの密接にリンクされたリストことを除いて、オブジェクトハッシュの構造に類似している根底ziplist圧縮符号化リストは、達成され、素子を保持する第1の部材と、第2の要素が格納された値、ヘッダ、フッタと近い大に小さな値近いです。
ここに画像を挿入説明

(2)skiplistエンコーディング

オブジェクトのセットを注文したが、基礎となるskiplistは、ジャンプや辞書の二種類の符号化が達成され、
各ノードは、テーブルホップコレクション要素を保持し、そして昇順の値を押し、部材要素のオブジェクト属性記憶ノード、スコア属性が成立スコア;
コレクション要素を保存するには、各キーの辞書、辞書を保存するための重要な要素のメンバー、および辞書の値が保存されたスコア。
ここに画像を挿入説明
なぜskiplistエンコーディングを達成するために、ジャンプや辞書の両方を使用するには?

  • ジャンプテーブル利点が順序付けされるが、クエリの複雑さO(LOGN)のスコア;辞書クエリースコアの複雑さO(1)が、障害は、これも少しは、構造に関連して実施すること。
  • 元素のメンバーと2つのスコアが、コレクションの構造の使用は二つの構造によって共有されているが消耗メモリなしで、同じアドレスへのポインタ。

エンコード変換の順序集合:

  • 順序付けられたコレクションオブジェクトをコードする二つの条件満たす必要ziplist使用:まず、以下64バイト以上の長さのすべての要素を、第二は、以下128以上の要素の数であり、符号化skiplist使用条件のいずれかを満たしていません。
  • 上記2つの条件がZSET-MAX-ziplist-エントリおよびオプションはZSET-MAX-ziplist-valueオプションRedisの設定ファイルを変更することができます。

シナリオ

一般的なシナリオをRedisの

  • キャッシュセッション(シングルサインオン)
  • setnxの使用:など、ロック分散
  • または最高のカウンタのリスト
  • 商品リスト、またはユーザーデータベースのリストなど
  • メッセージとしてリストを使用して列
  • スパイク、在庫およびその他の控除

アプリケーションシナリオの5種類

  • ストリング、高効率動作のためのRedisのKVは直接カウンタとして使用することができます。あなたがイメージとさえビデオを保存するためにそれを使用することができますので、例えば、などのオンライン統計の数は、他のタイプは、バイナリストレージセキュリティの文字列です。
  • ハッシュ構造がziplistあるときに使用されるハッシュのサイズが少なく設定されたサイズよりも大きいため、格納されたキー値ペアは、一般的に、また、等オブジェクトの基本属性情報、例えば、ユーザ情報、製品情報を維持するために使用することができる、よりコストメモリは、従って、データ記憶の多数の商品を大量に対応する画像のアドレスの名前を、例えば、メモリ節約の目的は、データ圧縮の断片化の量を達成するためにハッシュを使用することも考えられます。例:固定された商品コードは10ビットであり、前者は3フィールド、アドレス値として画像後キーハッシュ7として選択されてもよいです。これを超えない999その各ハッシュテーブル、限りハッシュ-MAX-ziplist-エントリredis.confは、1024年にでき変更しました。
  • リスト、リストタイプは、あなたはまた、ページネーションクエリを行い、rangeコマンドを提供するために使用することができ、メッセージキューを実装するために使用することができます。
  • 整数のリストを命じセット、コレクションは、直接設定を使用することができます。いくつかの重み関数は、例えば、ユーザ名もセット交差点、及び集合演算、見つけること共通特定の要素とすることができ、またなど、繰り返すことができない、に使用することができます
  • ZSET、順序付きセットは、範囲、リーダーボードまたは上位N機能を見つけるために使用することができます。

概要

データ・オブジェクトのRedisの5において、文字列オブジェクトは、ターゲット・データ・オブジェクトとして埋め込むことができる他の4つのうちの1つに過ぎません。

リスト(LIST)、ハッシュ(ハッシュ)、セット(SET)、順序付けられたセット(ZSET)実装の基礎となることは、圧縮を使用して両方の圧縮された状態のリスト構造、リスト構造を使用し、要素の数、バイト長で比較的小さいですショートの場合、

オブジェクトの4つのデータ圧縮リスト使用の利点:
メモリのオーバーヘッドを減少させる、メモリセーブ(1)は、Redisのメモリデータベースは、従って、メモリのオーバーヘッドを低減することが特定の状況下で必要です。
(2)メモリの断片化を減少させる、圧縮メモリブロックリストは、連続的であり、一度割り当てられたメモリの数。
(3)平均時間計算量はO(N)であり、特定の範囲内のNは再び、今回はほとんど無視できる程度であり、Nの上限値が設定され、新しいリスト、削除、検索操作を圧縮。
(4)4つのデータオブジェクトは、2つの符号化構造、高い柔軟性を有しています。

公開された158元の記事 ウォンの賞賛119 ビュー810 000 +

おすすめ

転載: blog.csdn.net/u013474436/article/details/104481591