内Redis
でのzset
複合構造:
-
使用
hash
保存するvalue
とscore
マッピング -
提供するに従って、ジャンプテーブルを使用して
score
ソートする機能を、と指定することができますscore
得るために範囲をvalue
のリストを
構造
zset
インテリアは、hash
辞書プラスジャンプテーブルskiplist
構造体zslnode { 文字列値、 ダブルスコア; zslnode * []を転送し; // 多層接続ポインタ zslnode下位* // バックポインタ } zslnode、 構造体ZSL { zslnode *ヘッダ; // ジャンプテーブルポインタ INT maxLevel; // 現在のトップジャンプテーブル 地図< 文字列、zslnode *> HT; // 構造体へのハッシュすべてのキー } ZSL。
画像は、実際には、意図のジャンプを示すRedis
合計64
最大収容可能層2^64
要素。
それぞれkv
のコードのブロックzslnode
、header
でvalue
あるNULL
値score
のDouble.MIN_VALUE
。kv
これらのキーに応じて、リンクポインタ二重連結リストの間で使用することがscore
順序付けされ、異なるkv
層の数より高い、床が異なっていてもよくkv
、以下同じ層kv
各層の一連の間のポインタを使用して、要素が由来するトラバースkv header
始まります。
共通操作
求めます
図に示すように、紫見つけるkv
最初から、header
より最初にトラバースを横断開始する最上位k
ノードの値が小さいほど、そして最後よりも層のレベルを見下ろすし続けるk
まで、ように小さい要素、及び要素まで検索。
最後のものは、底部の各層の元素のターゲットノードのノードリストよりも小さくなるまで検索する際の検索パスと呼ばれる一連のノードの中間には、上からです。
挿入
新しいノードが挿入された後には、最初に新しいノードを作成するために開始することができます右のノードを見つけるために検索プロセスと同様、適切な挿入ポイントを検索する必要があります。これはランダムノード、新しいノード及び探索経路上のノードを作成し、フロントとリアのポインタによって連結されたときに必要な層の数が割り当てられます。
現在のハイジャンプ最大の高さよりも、新しいノードアロケーションテーブルは、その後、ジャンプテーブルの最大の高さについて更新する必要がある場合。
削除
削除および挿入プロセスプロセスと同様、あなたが最初の検索パスを見つける必要があり、それぞれの層のために、関連するノードは、我々はそれを最高の上昇を更新するために世話をして、前にして再配置ポインタの世話をする必要がありますmaxLevel
。
更新
新しい値が場合はscore
変更のランキングポジションをもたらすことはありません、位置を調整する必要はありません、直接の要素変更score
に価値を、またはノードの位置を調整する必要があります。
Redis
delete要素を使用してノードの位置を更新し、この要素法を挿入する位置を調整する必要が決定されないように、2つだけの経路探索を必要とします。
場合score
値が同じです
極端な例では、zset
すべての要素score
と同じで、パフォーマンスを見つけるために、この時間は劣化していないO(n)
のでzset
、ソートのだけ考慮していないscore
場合は、score
同じことが、その後比較するvalue
値を。
コンピューティング要素のランキング
zset
することができrank
、主にので、ランキング要素を得るRedis
ため、skiplist
ノードforward
毎に最適化されたポインタforward
追加ポインタspan
属性が現在の層に沿って前のノードを示し、forward
中間ノードの数がスキップされるときポインタが現在のノードにジャンプ。
span
財産、要素の順位を計算するには、単に検索パスのすべてのノードに渡すspan
オーバーレイは、最終的な計算できる属性rank