Redisの分析に使用される実際のデータ構造

まず、一般的なデータ構造のリスト
1.String:
シンプルなキーと値の型は、値が文字列であってもよいし、また、デジタルかもしれません。使用シーンがキャッシュシステムドロップダウンボックスの値、インターフェイスを(使用は、メカニズムの有効期限が切れるキーインクリメント機構INCRを期限切れ)制限、分散セッションを保存している、ユーザーのポイントのように。
2.List:
単純な文字列のリスト、キューデータ構造タイプ(FIFO)、尾へのデータキューヘッドに挿入または削除することができます。一般的な使用方法のメッセージキュー(LPOP、rpush)とのシナリオ、チャート、リアルタイムチャート(Zsortを達成することができます)。
3.Hash:文字列型のフィールドと値のマッピングテーブル。使用シナリオは、ユーザーがログイン状態情報が(オブジェクトのプロパティが頻繁に変更)ショッピングカートは保存され、保存されています。
4.Set:
文字列型のコレクションは、無秩序な要素が繰り返されることはありません。使用シナリオ体系的なホワイトリスト、ブラックリストの設定
SET 5.Sort:
文字列型のコレクション、配列を決定要素と重複しません。チャートや一般のリアルタイムの設計に使用のような
2つの単純な動的ストリングSDS(シンプルダイナミック文字列)

sdshdr {構造体
// BUFアレイに使用されるバイトの数を記録
保存されたSDSは、文字列の長さに等しい//
LEN int型;
//レコードアレイバイトの未使用数BUF
無料int型;
//バイト配列と文字列を保存する
[] bufをchar型;
};
メモリを以下に示す:
[本明細書中に記載の画像インサート(https://img-blog.csdnimg.cn/20190724134444162.png?x-oss-process=image/watermark! 、type_ZmFuZ3poZW5naGVpdGk、shadow_10、text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L05hbkd1b0h1YW5nRG91、size_16、color_FFFFFF、t_70)
無料:0は未使用のスペースに割り当てられていないSDSを示しています。
LEN:5は、現在格納された文字列の長さが5で表します。
BUF:文字のchar型の配列。
![挿入ここで説明した画像(https://img-blog.csdnimg.cn/20190724135159624.png)
異なるフリーここに等しい図5は、割り当てられていない長さの5つのユニットがある文字列を示しています。
この未使用のスペースでは、Redisのは、事前に割り当てられた領域と不活性リリース2つの戦略を実現します。
予め割り当てられた領域:文字列空間拡張、必要以上の拡張メモリは、このようにして文字列操作を増加させるために必要なメモリの再割り当ての数が継続して行われる還元。
不活性リリース:文字列操作を短縮する場合、メモリはすぐに短く回収した余剰バイトを再割り当てしませんが、ダウン空きバイトの属性レコード番号の使用は、その後の使用を待ちます。(SDSはまた、対応するAPIを提供する場合、私たちがする必要がある場合、あなたはまた、手動で未使用のスペースを解放することができます。)

三、リストの
リストノードの定義:

構造体{listnodeのtypedef

//プリアンブルノード
構造体listnode * PREV;

//リアノード
次構造体listNode *;

値//ノード
ボイド*値;

} listnode;

二重連結リスト
[ここに挿入した画像(HTTPS:/! /img-blog.csdnimg.cn/20190724143745229.png)
リスト操作リストを使用

リスト構造体{typedefの

//ヘッダノード
listnode *ヘッド;

//テーブルテイルノード
listNode *テイル、

ノードの数がリストに含ま//
unsigned long型LEN;

//コピーノード値関数
ボイド*(* DUP)(ボイド *のPTR );

//解放関数のノード値
のボイド(フリー*)(void *型PTR);

//ノードの値の比較関数
のint(*試合)(PTRボイド*、無効)キー*;

リスト};

:それはリストテーブルポインタヘッド、テイルポインタテーブルテール、及び鎖長カウンタLEN、DUP、フリーと一致メンバーが多型リストの特定のタイプを達成するために必要な機能であるため、リスト構造を提供
●DUPコピー機能が使用されていますノードリスト格納された値、
記憶された値を解除する●フリーリストノード機能;
●関数は、入力値とノードリストに格納された他の比較値を一致させるために使用さは等しく
[挿入ここで説明した画像(HTTPS! :X-OSSプロセス//img-blog.csdnimg.cn/20190724144054122.png =画像/透かしを、type_ZmFuZ3poZW5naGVpdGk、shadow_10、text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L05hbkd1b0h1YW5nRG91、size_16、color_FFFFFF、t_70)
4つの辞書
Redisの辞書には、下にあるように、ハッシュテーブルを使用して実装しました複数のノードを有することができ、ハッシュテーブル、ハッシュテーブル、ハッシュテーブル上の各ノードは、キー値ペアの辞書を保持します。HashMapののJavaと同様に

構造体{dicthtのtypedef

//ハッシュテーブルアレイ
dictEntry **表;

//ハッシュテーブルのサイズ
のunsigned longサイズ、

指標値を算出するためのハッシュマスクテーブルの//サイズ
// 1は常に同じサイズである
符号なしのロングsizemask ;

数//既存のノードのハッシュテーブル
の符号なしあれ;

} dictht。

ノードの定義

構造体{dictEntryのtypedef

//キー
ボイド*キー;

//値
連合{
ボイド*ヴァル;
uint64_tu64;
int64_ts64;
} V;

//ハッシュテーブルポイント次のノードに、リストが形成される
構造体*次dictEntry;
} dictEntry、

両者の関係次のような構造である:
![挿入ここで説明した画像(https://img-blog.csdnimg.cn/2019072414502986.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L05hbkd1b0h1YW5nRG91,size_16,color_FFFFFF,t_70) ![ここに挿入画像の説明](https://img-blog.csdnimg.cn/20190724145131933.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L05hbkd1b0h1YW5nRG91,size_16,color_FFFFFF,t_70)

あなたは辞書に新しいキーを追加したい場合は、プログラムは、ハッシュキー値とインデックス値をキーに従って、その後、インデックス値に基づいて算出されるように、キーと値のペアに新しいノードを備えるハッシュテーブルを必要とします上記のハッシュテーブルの配列のインデックスを指定します。

**ハッシュアルゴリズム**
>辞書を使用して、ハッシュ関数が提供され、キーのキーのハッシュ値を算出
> =ハッシュdict->タイプ-ハッシュ関数(キー)>;
sizemask特性およびハッシュテーブルを使用してハッシュ値>算出された指標値
>状況に応じて、HTは、[X] HTことができる[0]またはHT [1] NDEX =ハッシュ& dict-> HT [X] .sizemask。


** **解決キーの競合

>二つ以上のキーの数は、上記と同じ配列インデックスハッシュテーブルに割り当てられているがある場合、我々は、これらのキーの衝突(コリジョン)を呼び出します。
>アドレスチェーン(別使用Redisのハッシュテーブルメソッド
競合を解決する>連鎖)キーは、各ノードは、次のポインタが、次のポインタで単独でリンクされたリストを構成することができるノードのハッシュテーブル複数、割り当てられたハッシュテーブルを有しています同じインデックス上の複数のノードへの紛争の主要な問題に対処するだろう、このようにリンクされたリストを、接続するために使用することができます。

![ここの挿入の説明](https://img-blog.csdnimg.cn/20190724162244200.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L05hbkd1b0h1YW5nRG91,size_16,color_FFFFFF,t_70)
**拡張収縮**

あなたに多すぎても少なすぎても、ハッシュテーブルのキーを保存すると>、それはrerehash(焼き直し)でハッシュテーブルの伸縮に対応する必要があります。具体的な手順:
>
拡張操作を実行する場合>図1は、(すなわち、拡張はオリジナルのハッシュテーブルに基づいて、各元のハッシュテーブルに従って使用されるサイズに等しいHT [0] * 2Nハッシュテーブルを作成し.used )別のハッシュテーブルを作成するためのスペースを倍増。あなたが縮小操作を実行している場合は逆に、減少している各収縮は、スペースの使用に基づいてされた新しいハッシュテーブルを作成するために倍増しました。
>
> 2、再度インデックス値、およびハッシュテーブルの位置に新しいキーと値のペアを計算するために上記ハッシュアルゴリズムを使用して。
>
移行が完了した後> 3、すべてのキーと値のペアがあり、オリジナルのハッシュテーブルのメモリ空間を解放します。

拡張をトリガー**条件

> 1、サーバは、現在BGSAVE BGREWRITEAOFコマンドまたはコマンドを実行していない、そして負荷率が1以上です。
>
> 2、サーバは、現在BGSAVE BGREWRITEAOFコマンドまたはコマンドを実行し、負荷率が5以上です。
>
> PS =因子をロードノードの保存されたハッシュテーブル/ハッシュテーブルのサイズの数。漸近的に焼き直し
>
>伸縮操作は、集中完了使い捨てではなく、複数回、漸進的に完了しました。あなたはわずか数十にRedisのキーと値のペアを保存する場合は、焼き直しは
>瞬時に行うことができますが、キーと値のペアでも数百万人、数千万あるいは何百万、数百を持っている場合は、1回行うように
、>焼き直しを必然的に他の操作につながる時間のRedisの期間内に実行することはできません。だから、Redisのプログレッシブ使用しています
>焼き直しをするので、プログレッシブ焼き直しの期間中に、更新を見つけるために辞書を削除し、他の操作は、最初のハッシュテーブルが見つからなかった2つのハッシュテーブル上で実行することができる、それが第二ヘクタールに行きますテーブルの上に見つけることを願っています。しかし、こと
>の増加操作は、新しいハッシュテーブル上で行わなければなりません。

おすすめ

転載: www.cnblogs.com/jarvisblogs/p/11257828.html