Redisの-skiplistテーブルのデータ構造をジャンプ

Redisでのzset複合構造:

  • 使用hash保存するvaluescoreマッピング

  • 提供するに従って、ジャンプテーブルを使用してscoreソートする機能を、と指定することができますscore得るために範囲をvalueのリストを

構造

zsetインテリアは、hash辞書プラスジャンプテーブルskiplist

構造体zslnode {
     文字列値、
     ダブルスコア; 
    zslnode * []を転送し; // 多層接続ポインタ 
    zslnode下位*     // バックポインタ
} zslnode、
構造体ZSL { 
    zslnode *ヘッダ;           // ジャンプテーブルポインタ
    INT maxLevel;              // 現在のトップジャンプテーブル 
    地図< 文字列、zslnode *> HT; // 構造体へのハッシュすべてのキー 
} ZSL。

画像は、実際には、意図のジャンプを示すRedis合計64最大収容可能層2^64要素。

それぞれkvのコードのブロックzslnodeheadervalueあるNULLscoreDouble.MIN_VALUEkvこれらのキーに応じて、リンクポインタ二重連結リストの間で使用することがscore順序付けされ、異なるkv層の数より高い、床が異なっていてもよくkv、以下同じ層kv各層の一連の間のポインタを使用して、要素が由来するトラバースkv header始まります。

共通操作

求めます

図に示すように、紫見つけるkv最初から、headerより最初にトラバースを横断開始する最上位kノードの値が小さいほど、そして最後よりも層のレベルを見下ろすし続けるkまで、ように小さい要素、及び要素まで検索。

最後のものは、底部の各層の元素のターゲットノードのノードリストよりも小さくなるまで検索する際の検索パスと呼ばれる一連のノードの中間には、上からです。

挿入

新しいノードが挿入された後には、最初に新しいノードを作成するために開始することができます右のノードを見つけるために検索プロセスと同様、適切な挿入ポイントを検索する必要があります。これはランダムノード、新しいノード及び探索経路上のノードを作成し、フロントとリアのポインタによって連結されたときに必要な層の数が割り当てられます。

現在のハイジャンプ最大の高さよりも、新しいノードアロケーションテーブルは、その後、ジャンプテーブルの最大の高さについて更新する必要がある場合。

削除

削除および挿入プロセスプロセスと同様、あなたが最初の検索パスを見つける必要があり、それぞれの層のために、関連するノードは、我々はそれを最高の上昇を更新するために世話をして、前にして再配置ポインタの世話をする必要がありますmaxLevel

更新

呼び出されたzaddときに方法、もし対応するvalue直接挿入、存在せず;そして既にが更新された場合にのみscore、それが更新される必要があります。

新しい値が場合はscore変更のランキングポジションをもたらすことはありません、位置を調整する必要はありません、直接の要素変更scoreに価値を、またはノードの位置を調整する必要があります。

Redisdelete要素を使用してノードの位置を更新し、この要素法を挿入する位置を調整する必要が決定されないように、2つだけの経路探索を必要とします。

場合score値が同じです

極端な例では、zsetすべての要素scoreと同じで、パフォーマンスを見つけるために、この時間は劣化していないO(n)のでzset、ソートのだけ考慮していないscore場合は、score同じことが、その後比較するvalue値を。

コンピューティング要素のランキング

zsetすることができrank、主にので、ランキング要素を得るRedisため、skiplistノードforward毎に最適化されたポインタforward追加ポインタspan属性が現在の層に沿って前のノードを示し、forward中間ノードの数がスキップされるときポインタが現在のノードにジャンプ。

span財産、要素の順位を計算するには、単に検索パスのすべてのノードに渡すspanオーバーレイは、最終的な計算できる属性rank値を。

おすすめ

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