一、Redisのハッシュ
基礎となるハッシュ・テーブルとして実現1、Redisの辞書は、ノードが複数のハッシュテーブルを有することができ、ハッシュテーブルは、ノードの各ハッシュ・テーブルは、辞書キーペアで保存されています。
図2に示すように、辞書で使用Redisのハッシュテーブルdict.h/dictht
定義構造:
typedef 構造体dictht { // ハッシュテーブルアレイ dictEntry ** 表; // ハッシュテーブルのサイズ の符号なしロングサイズ; // 指標値を算出するためのハッシュテーブルのサイズマスク // 常に同じサイズ- 1。 符号なしのロングsizemask ; // 既存のノードのハッシュテーブルの数 、符号なしのロング使用され; } dictht。
1.tableプロパティ属基を指し、配列の各要素でありますdict.h/dictEntry结构的指针,每个
dictEntry结构保存着一个键值对;
ノード(キーと値のペア)の数がある2.size属性はそれが、配列表のサイズであり、ハッシュ・テーブルのサイズを記録し、使用するプロパティは、ハッシュテーブルを記録します。
属性の3.sizemask値は常にサイズ-1に等しく、プロパティ値は、インデックステーブルは、アレイ上に配置する必要があり、ハッシュキーで決定。
3.ハッシュ・テーブル・ノードが使用するdictEntry
各前記の構造dictEntry
構造はキーと値のペアで保存されました:
typedefは構造体dictEntry { // キー ボイド * キー; // 値 連合{ ボイド * ヴァル; uint64_tをU64; int64_tのS64; } V; // 点の次のノードのハッシュテーブルには、リンクされたリストが形成される 構造体 dictEntry * 次に; } dictEntry。
1.key属性は、キーの鍵を保持しており、Vは、Vの値がポインタ、またはuint64_tを整数、または整数int64_tのでもよい保存されたキー値ペアの属性値です。
2.nextプロパティは、ハッシュテーブル内の別のノードへのポインタであり、ポインタのハッシュ値は、競合結合を解決するために、一緒に接続された同じキー問題複数であってもよいです。
同じキーを2つのインデックス値K1とK0に次のポインタによって接続方法を、示しています。
図4は、辞書内のRedisは、dict.h/dict
の構造を示しています。
typedef 構造体辞書{ // タイプ特異的機能 dictType * タイプ; // プライベートデータ ボイド * privdata; // ハッシュテーブル dicthtのHT [ 2 ]; // 焼き直しインデックス // 焼き直しが行われない場合には、-1の値が int型 rehashidx ; / * 進捗IF rehashidx == -1にない焼き直し* / }のdict。
1. type
特性およびprivdata
多型辞書のセットを作成するために、キーと値のペアの異なるタイプの性質;
2. ht
プロパティは、アレイ内の各エントリは2つのエントリを含む配列であるdictht
通常の状況下では、ハッシュテーブルは、辞書のみ使用ht[0]
ハッシュテーブルを、ht[1]
ハッシュテーブルのみをしますht[0]
使用されたときにハッシュテーブル焼き直し;
加え3. ht[1]
外、および別の焼き直し関連特性rehashidx
:現在、次に、その値を焼き直しを行っていない場合、それは現在のペースを記録焼き直し-1
。
4は(ない焼き直しのための)辞書の通常の状態を示しています。