たSortedSet Redisのは〜最も複雑なデータ構造でなく、最も尋ねたインタビューでなければなりません
最も簡単なアプリケーションを見てください:
redis 127.0.0.1:6379> ZADD todayScoreRank 100 张三
redis 127.0.0.1:6379> ZADD todayScoreRank 90 李四
redis 127.0.0.1:6379> ZADD todayScoreRank 80 王五
redis 127.0.0.1:6379> ZADD todayScoreRank 70 赵六
redis 127.0.0.1:6379> ZADD todayScoreRank 60 李七
redis 127.0.0.1:6379> ZRANGE todayScoreRank 80 100 WITHSCORES
秩序を達成するには、次の各要素(ジョン・ドウ)を与えることによって、スコア(100,90スコア)を高めます。
SortedSet実装原理を理解する前に、私が言及しなければならない一つのことは、それは次のようになります。
メモリの効率的な利用がメインラインのRedisのデザインになったか、そう、Redisのは、ワーキングメモリであり、メモリコストが非常に高く、
Redisのに原理を理解するための引数は、非常に有用であり、時間が再利用より多くのメモリ・ソリューションを許可していない場合には、それはプログラムがメモリを節約することを可能にする時間がかかります場合です。
まず、我々はいくつかのパラメータを見て:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
これら2つのパラメータを理解する前に、我々は最初にziplist名前が示すように、この単純なデータ構造を理解する:圧縮のリストを、圧縮方式は、短期では、小規模のために、マルチバイトの比較を持つ大規模なデータストレージのためになりますか店舗に少ないバイトの使用上のデータは、別の記事では、具体的話をします。
if (
field-value对的数量 > ziplist.entries.size ||
任意一个filed或value长度 > zset-max-ziplist-value
) {
// 使用 zset 进行存储
} else {
// 使用 ziplist 进行存储
}
このように、データの量が比較的小さく、かつziplist検索時間制御のトラバーサル、およびメモリ空間を節約することができます
それはZSET後に選択する際に、ここにあなたのメインキャラクターのデビューを知っています:
typedef struct zset {
dict *dict;
zskiplist *zsl;
} zset;
ZSET構造は、二つの要素があり、辞書は、データはデータ点の間の関係を維持するために使用される関係のスコア一zskiplistを維持するために使用しました
ハッシュテーブル席=> 100、ジョン・ドウ=> 90点の関係を維持することによって、ストレージ内の辞書には、多くの導入はありません。
そして、主人公ZSETくださいサークルzskiplist(:ない通常のジャンプテーブルのzジャンプテーブル、ノート)があります。
typedef struct zskiplist {
struct zskiplistNode *header, *tail;
unsigned long length;
int level;
} zskiplist;
zskiplist構造は、4つの要素を有するヘッドとテールポインタは、リスト全体の長さを指している、との最大数は、表面層をホップ。
ジャンプテーブル、それは何ですか?その原点で見てみましょう:
私たちは、リストには、100個のノードが存在する場合、ノードはこの問題を解決するために、対応する値(ジョン・ドウ)を得るために横断するノードの中間の半分を見つける必要があり、ランダムアクセスを通過することができないための唯一の特徴であることを知っています、ジャンプテーブルは、(ジャンプテーブルは、彼らがしているよりも、ずっと簡単達成するため、一部の人々は、なぜバランスがとれていない木を求めることができる)されて入ってきました
これは、元のリストに基づいて、従来のジャンプテーブルは、層が増加すると、より少ない、よりアップ要素によって新しいノード間リスト、層の上部の層を追加することです。検索は、それが目標現在のノードよりも小さく検出された場合、上位5、4からリストの要素を検索し、次のノード5 6> 5、次に次のレベルのリストを、というようになります。この場合、より多くの要素が、大幅に要素を見つけるための時間を短縮することができます。
次のようにしかし、通常のジャンプテーブルは、多くの制限と問題点があります。
(1)繰り返しのスコアに許可されていません
(2)第一層は、柔軟性のない、単独でリンクされたリストであります
次のようにこのように、本発明のRedisのzskiplist改良版です。
繰り返し割合を可能にし、リストの二重リンクリストの最初の層は、逆引きの範囲を容易にするために、増加スパン(SPAN)の概念は、順方向および逆ランキングの計算を容易にします
これは、徹底的原則ソートセットのデータ構造を実装し、それを考え出しました。
私はこれらの基本的な原則を学んだと思う彼らは私たちの知識を拡大し、代替プログラムの問題が発生したときだけでなく、顔の裁判を見ているため、より多くの解決するために、私たちの視野を広げることであり、より多くのです問題は報われないとき!