Redisのデータ構造-quicklistクイックリスト

リスト

Redis以前のバージョン、蓄積list時間リスト構造、圧縮の使用に至るまでの要素のリストであればziplist、そうでない場合は二重リンクリストを使用linkedlist

//リストノード
構造体listnode <T> { 
    listnode * PREV。
    listnode *次に、
    Tの値; 
} listnode; 
//リスト
のstruct {リスト
    listnode *ヘッド; //テーブルポインタ
    listNode *テイル; //テーブルの末尾ポインタ
    長いですLEN; //鎖長
}リスト。

リストについては、我々は次の特性があります。

  • ダブルエンド:ノードとprevし、nextポインタが正面を得るために、リアノード

  • 非環式:ヘッダprevテールテーブルとtail方向付けNULL

  • テールポインタテーブルヘッダーで:ヘッダーテーブルテール・ノードの複雑さを取得します。O(1)

  • 鎖長カウンターで:複雑ノードの程度を求めますO(1)

  • 多型:使用されるvoid*ノードの値を格納するために、値の異なるタイプを記憶することができます

クイックリスト

ので、リストに追加のスペースが比較的高く、リンクされた64bitシステムがポインタで8バイト、prev及びnextポインタが占有しなければならない16バイトを、リストノードと個別にメモリに割り当てられた、メモリの断片化は、メモリ管理の効率に影響を与え悪化しました。

上記の欠点リンクリストを考慮すると、Redis使用リストを変換データ構造の後続バージョン、quicklistの代わりにziplistlinkedlist

//迅速ノードのリスト
{ストラクトquicklistNode 
    quicklistNode * PREV。
    quicklistNode *次に、
    ziplist * ZL; //ポイント圧縮のリスト
    サイズINT32;バイトの// ziplist総数
    INT16カウント; //要素の数ziplist 
    エンコーディングINT2が; //ストア形、または圧縮LZFに格納されたバイトの一次配列を表す
    ... 
quicklistNode}; 
//クイックリスト
構造体{クイック
    quicklistNode *ヘッド; 
    quicklistNode *次に、
    ロングカウント; //要素の数が
    ノードをint型; //数ziplistノード
    INTのcompressDepth ; // LZF圧縮アルゴリズム深度
} 
クイック。

ASは、コードから分かるようにquicklist、実際にziplist、及びlinkedlistそれらの混合物、それがあろうlinkedlist押し部がセグメント化され、使用される各セグメントziplistコンパクトに収納するために、複数のziplistポインタ間の双方向シリーズ。

quicklist内部デフォルトの単一ziplistの長さの8kバイトは、新しいからのバイト数を超えてしまいますziplist店。

ではquicklistインテリア、さらにスペースを節約するために、だけでなく、使用LZFするアルゴリズムziplistストレージを圧縮します。

デフォルトでは、quicklist圧迫深さ0、すなわち圧縮なし、構成によって実際の圧迫深度list-compress-depthの決定。

速いサポートするためにpop/pushquicklist最後の2つをziplist圧縮せずに、圧縮ケースの深さ1、深さ2、それは最後に第1および第2の端を意味しziplist、圧縮されていません。

おすすめ

転載: www.cnblogs.com/jeemzz/p/11444143.html