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
の代わりにziplist
とlinkedlist
。
//迅速ノードのリスト {ストラクトquicklistNode quicklistNode * PREV。 quicklistNode *次に、 ziplist * ZL; //ポイント圧縮のリスト サイズINT32;バイトの// ziplist総数 INT16カウント; //要素の数ziplist エンコーディングINT2が; //ストア形、または圧縮LZFに格納されたバイトの一次配列を表す ... quicklistNode}; //クイックリスト 構造体{クイック quicklistNode *ヘッド; quicklistNode *次に、 ロングカウント; //要素の数が ノードをint型; //数ziplistノード INTのcompressDepth ; // LZF圧縮アルゴリズム深度 } クイック。
ASは、コードから分かるように
quicklist
内部デフォルトの単一ziplist
の長さの8k
バイトは、新しいからのバイト数を超えてしまいますziplist
店。
ではquicklist
インテリア、さらにスペースを節約するために、だけでなく、使用LZF
するアルゴリズムziplist
ストレージを圧縮します。
デフォルトでは、quicklist
圧迫深さ0
、すなわち圧縮なし、構成によって実際の圧迫深度list-compress-depth
の決定。
速いサポートするためにpop/push
、quicklist
最後の2つをziplist
圧縮せずに、圧縮ケースの深さ1
、深さ2
、それは最後に第1および第2の端を意味しziplist