Redisの関連ノート(3 .redis設計と実装(ノート))


1.データ構造

1.1シンプルな動的な文字列:

そして、それらの属性は、INT LEN:長さ、INT自由:自由長は、[]バリ文字:文字列(コンテンツ)
文字列の長さは、単純な取得と、
バッファオーバーフローを防ぐ、
文字列の長さを変更する量を減少させるために必要なメモリの割り当ての数、
バイナリセキュリティ、互換性のある部分のC文字列関数。

1.2リスト:リストはlistNodeを使用して実装されています

listnodeとその属性で構造体listNode * PREV:前のノード、構造体listNode *次:ノードの後に、無効*値:現在のノードの値の
リストとその属性がlistNodeです*ヘッド:ヘッドノード、listNode *尾:尾のノード、長いLEN:ノードの数(長さ)

1.3辞書:

競合dictEntryポイントは、次のリストに存在する場合、合わせハッシュ&sizemaskにおけるインデックステーブルdicthtの取得、その後、得られたk個のハッシュ値
ハッシュテーブルが伸縮するとき、プログラムはハッシュテーブルは、既存のすべてのを含んでいる必要がありハッシュテーブルに新しいキーと値のペアを焼き直し、そして緩やか熟練
1.4ジャンプテーブル:下地zskiplistによって実装収集ヘッダノードとして記憶zskiplistNode組成物、zskiplistジャンプテーブル情報、テイルノードテーブル、長さを命じ;
1.5整数:一の実装の基礎となる鍵のセット、記憶素子の重複することなく整然と実施下地アレイ
1.6パッキングリスト:キーのリストとキー基本となる一実施態様をハッシュ、それぞれ、複数のノードを含みます。ノードはバイト配列または整数値に格納することができます


2.オブジェクトの各オブジェクトはredisObject示される構造で表されます。


そして、それらの属性がunsigned型である:タイプ、符号化:符号化、ボイド* PTR:基礎となるデータ構造に実装ポインタポイント
タイプ値REDIS_STRINGさ(タイプ、すなわち、型は、値が格納された値を意味する):文字列を、REDIS_LIST:リスト、REDIS_HASH :ハッシュ、REDIS_SET:コレクション、REDIS_ZSETが:順序集合
符号化された値の基礎となるデータ構造の符号化(すなわちデータ構造の決定ポインタ)が対応している
REDIS_ENCODING_INT長整数型の
単純な文字列エンコードさembstr REDIS_ENCODING_EMBSTR
REDIS_ENCODING_RAW単純な動的文字文字列
REDIS_ENCODING_HT辞書
REDIS_ENCODING_LINKEDLISTダブルエンドリスト
リストREDIS_ENCODING_ZIPLIST圧縮
REDIS_ENCODING_INTSET整数
REDIS_ENCODING_SKIPLISTジャンプや辞書
とその属性は参照カウントされている:回復のためのカウントとメモリの共有オブジェクトを
ガベージコレクションを:
参照カウント、参照カウントプログラムは、情報オブジェクトを介して追跡することができます、自動的に適切な時間とは、オブジェクトのメモリの回復を解放し
、新しいオブジェクトを作成するときに1であり、新しいプログラムが使用され、エネルギー自給;もはやので、マイナス1、使用;および0のとき、メモリが解放され、
オブジェクトの共有を:
データベースをこれは、ポインタの値を参照します 目標電流値は、同じ2つのキー文字列オブジェクトを参照するために、参照カウントがインクリメントされます。
Redisの新しいサーバーがこれらの共有オブジェクトを使用しますが、0から9999のすべての整数値を含む1万文字列オブジェクトを作成し、サーバーを初期化しますが、ない
とその属性はLRUです:オブジェクトを記録し、最後のコマンドプログラムをアクセスされました時間は、使用するメモリの回復
サーバは、アイドリング時の長い高設定maxmemoryオプション、揮発性-LRUまたはallkeys-LRUを回復するためのサーバーのメモリアルゴリズム、および設定された制限を超えるが、解放されたメモリを回復している場合

3.データベース:

redisServerサーバーの構造体
のすべてのデータベースサーバーのアレイ:そのプロパティredisDb *デシベル
その性質がdbnum int型:サーバのデータベースの数、
クライアントはredisClient STRUCT
そのプロパティDBを:配列内のデータベース・サーバへのワンポイント

データベース鍵空間
構造体redisDb {typedefの
辞書*辞書; / *このための鍵空間のDB * / 鍵空間
...
} redisDb、
データベースの操作のためのdictの現場作業の実際の実現
生き残りの鍵とは削除
生存時間を、キー指定pexpireコマンドで有効期限が切れる
3種類のポリシーを削除します。
削除されたタイミング、削除された期限切れセットタイマーを作成すると同時に、有効期限が切れました。CPU非友好のために
削除された不活性に関係なく、キーの期限切れの削除かどうかを確認するためのキーを取得する、期限切れ、期限が切れていないが返されます。無愛想なメモリ
期限切れのチェックを削除し、定期的に削除し、定期検査データベース、。あなたは、合理的な周波数兼最高経営責任者(CEO)を設定する必要性を削除する場合

4.持続性:ディスクにデータベース内のデータを保存します

1.RDBの永続性

1.RDBファイルを作成し、負荷:データベースレコードのデータベースの状態にデータを保存することにより、

世代、そしてBGSAVE SAVEコマンド
作成RDBファイルまでSAVEは、サーバー・プロセスをブロック
BGSAVEが子プロセスを生成、このプロセスによって作成されたRDBファイルには、サーバー・プロセスは、他のコマンド処理を継続し
、RDBファイルが自動的にロードされるロードをサーバーの起動時(開いていませんAOF持続時間)

設定redis.conf間隔2.自動的に保存設定することができ、次のように

一度行われる変更900 1 900秒節約
300 10 300セーブ10秒以内に行われる変更で
この修正は、10000 60セーブで60秒以内に行われる万
100ミリ秒ごとに限り、構成チェックの条件が満たされている保存serverCronを出会いが実行されるBGSAVE

3.RDBファイル構造

Redisの| DB_VERSION |データベース| EOF | check_sum
定数バージョン4バイトは、ゼロ以上のデータベース8バイトの符号なし整数定数含まれ
、以下のようにデータベースが構成されているデータベース
DB_NUMBER | | SELECTDBをkey_value_pairs
すべてのキーの一定数のデータベースを
....

 

2.AOFの永続性:データベースの状態を記録するためのRedisサーバを保存することで実行されるコマンドを書きます

1.命令追加

redisServer属性に関連する実行コマンドのストレージ・サーバがありaof_buf

2.ファイルの書き込みとの同期

クライアント要求イベントの完全な実装の前にServerは、ファイルにaof_bufバッファに書き込むかどうかを検討する
サーバーappendfsync設定項目があり、その値はすることができ
、常に:aof_bufは、すべてのファイルへの書き込み、同期
everysecを:ファイルに書き込まれるすべてのコンテンツ、第二よりも最後の同期イベントは、特別なスレッドがあります同期するための責任がある
なしを:オペレーティングシステムを同期するタイミングを決定、ファイルへの書き込みが、同期していません

書き換え3.AOF:

ファイルには、より成長していると多くの、新しいコマンドが合併する書き換えるために、され
AOFファイルの操作の同じセット上の2つの異なる回の2つのコマンドを持っているとして、このコマンドはに組み合わせることができ
、書き換え背景:親プロセスを継続しますプロセスはその後、AOFに再書き込みやファイルを同期、バッファに、期間を書き換え、書き換えのプロセスから親コマンド処理AOFを指令します。

5.イベント:Redisのサーバーはイベントドリブン型のプログラムであり、

1.ファイルイベント:サーバソケット抽象操作

プログラムリスニングソケットのI / Oを多重化複数、同期キューにファイルがソケット・イベント・ディスパッチャに送信されるたびに、キューを命じ、ディスパッチャは、時間に応じて生成された適切なファイルを呼び出しますイベントハンドラ
最も一般的なイベントハンドラ:
ソケットをリスニングソケットサーバをリスニングクライアント接続は、プロセッサによって実行さAE_READABLEイベント、生成、応答プロセッサを接続する
プロセッサを要求するコマンドを、クライアントがサーバーソケットを聞いて、コマンド要求を送信しますソケットは、プロセッサによって実行されるAE_READABLEイベント、生成
コマンド処理応答を、クライアントソケットは、プロセッサによって実行されるAE_WRITABLEイベントを生成します

2.タイムイベント:タイマー時間(実行時間)と定期的なイベント(どのくらいの頻度回実行)。

時間はあなたがtimeProc、実行する必要があります:3つの属性は、ID:ときのアイデンティティは、物事に対処する必要がある
すべてのリストを通じて行い、ランダムなリストに配置されたすべての時間イベント、イベントの実行時間がある
現在、Redisのサーバータイムイベントサーバーがシャットダウンされるまで、応用例serverCron機能は、定期的なイベントは、一度ので、頻繁に実行される実行
redis.conf設定オプションであっヘルツを、秒あたりの回数は、この機能を実行するには、デフォルトの10に設定することができ
、ファイルのイベントと時間をパートナーシップのためのイベント、両方のサーバーが処理したイベントが設定が完了するまでの時間であるかもしれないすべての時間をつかむませんが、処理時間がターンを取ります。

6.クライアント:クライアントのstruct

Redisのクライアントリストコマンド入力接続して次のように表示される
43836:ID = 2 ADDR = 192.168.37.134 FD = 6名=年齢= 181355アイドル= 1つのフラグ= SのDB = 0サブ= 0 PSUB = 0マルチ= -1 qbuf = 0 qbufを0 = 0 = OBLフリーOLL OMEM = 0 = 0 = R&LT CMD = replconfイベント
ID = 192.168.37.134 ADDR = 14:FD = 50888 = 258 7年齢名= IDLE =フラグ= 0、N = 0 DB = 0サブPSUBとマルチqbuf -1 = 0 = 0 = 32768 = OBL無料qbuf-OLL = 0 = 0 = 0 OMEMイベントCMD = = R&LTクライアント
ID = ADDR = 192.168.37.1 15:55242 FD =名=年齢= 8 4 4 = IDLE。フラグ= N DB = 15副= 0 PSUB = 0マルチ= -1 qbuf = 0 qbuf無= 0 OBL = 0 OLL = 0 OMEM = 0イベント= R CMD =選択
サーバは、3つのクライアント接続有し
番号:一意の識別子、ADDR:接続アドレスやFD:フラグ、-1擬似クライアント(例えばAOFまたはLUAスクリプト)、年齢:サーバーへの接続の長さ、フラグ:ロールフラグ(サーバ用の例えば、S)、DB:データベース番号、qbuf :入力バッファ、CMD:コマンドが最後に実行します

7.サーバー:複数のクライアントとの接続を確立し、データを保存し、エクスプローラを介してサーバ動作を維持

1.コマンド実行

1.サーバーは、クライアント入力バッファ、分析のためのコマンドバッファ、およびパラメータのパラメータの数に保存されて、RESP契約を読み込む
のargcでクライアントのargvプロパティとプロパティ節約するために2
3.呼び出しコマンド実行を、コマンドを実行します。1.検索コマンドを、前処理2を行い、3が関数呼び出し命令を実装し、フォローアップ4 ..の実装
4.クライアントソケットは、クライアントにコマンドを返信書き込み可能

2.serverCron機能

サーバーのステータス情報、リソース管理、クライアントとデータベースの状態が永続化の実装をチェックし、更新します

3.サーバを起動します

1.サーバーの初期状態
2.サーバーの構成ロード
3.サーバの初期データ構造
4.データベースの状態復元
イベントループの実行5.
コピー8.を
すべて同期
サーバから送信1. SYNCコマンドを
2.サーバーがマスターサーバーからのコマンドを受信しますRDBは、ファイルを生成し、すべての注文の書き込みバッファの記録が今始まる
メインサーバがRDBにファイルを送信します。3.、RDBは、サーバからサーバからロード
4.サーバーのメインバッファ書き込みコマンドがに、サーバから送信された
同期部:壊れメイン重いから処理の効率的な複製
オフセット\複製バックログバッファ\ IDサーバが実行は、3つの部分に達成されるコピーすることによって


9. Sentinelは:センチネルの例は、プライマリサーバを監視し、一つ以上により、プライマリサーバからプライマリサーバへのサーバからオフラインに関係するだろう


1.センチネル・サーベイランスのすべての情報をインスタンスマスタレコードを初期化し、2台のプライマリサーバを作成するためにリンクされ、およびサブスクリプションリンクコマンドリンク
マスターサーバーコマンドで取得したデフォルトのコマンド情報の送信情報による2リンク10秒を
取得3.コマンドリンクからサーバ情報から作成され、サーバーインスタンスに情報を保存するために、コマンドからのリンクを介して、リンクサーバーに利用できる購読する
ことが組立ラインをオフに決定された場合、サーバー構成は、第一の目的オフラインである4.設定し、各定点サーベイランス協議選挙は、組立ラインセンチネルプライマリサーバのフェールオーバー(いかだアルゴリズム)オフリードする
サーバから他の新しいマスターコピーは、サーバがマスタは組立ラインオフされているとなるように、プライマリサーバベースのサーバーからの変換内のすべてのサーバーから選択5.リードセンチネルをサーバーから新しいマスターサーバーとして

クラスタ10:分散データベースプログラム、スライスを介して共有データ、およびフェイルオーバーコピーを提供

クラスタノードCLUSTERNODE構造に関する情報を保存する
保存されたキー値ペアの断片によってクラスタ、クラスタ全体のデータベースは、16,384スロットに分割され、異なるノードに割り当てられた異なるスロット
MOVEDエラー:ノードがコマンド要求、キーチェック溝を受信した場合情報を運ぶ右ノードに間違ったターンを動かし、その後、クライアントMOVEDエラーに戻って、自分自身に責任がある、そうでない場合は
、再スライスに:あるノードから別のノードへ転送されるすべてのスロットに属しているタッチキーは、
エラーをASK:再配布を鍵データベースを指定するフィルム、ノードが自身のデータベースコマンドでは見られない、それは別のノードを探すために継続してクライアントを導くためにASKエラーが返されます

11.サブスクリプションとパブリッシング

クライアントは、すべての加入者がメッセージ受信しますクライアントは、他のチャネルにメッセージを送信するときに、加入者に1つまたは複数のチャネルに加入し、チャンネル
のサブスクリプションを:「チャンネル」を購読...送信するには:「チャンネル」を公開「メッセージ「退会:退会」チャンネルを」...
全チャンネルのためにクライアントリストに加入、追加するためにサブスクライブチャンネルを指し、redisServerの辞書pubsub_channels内のすべてのチャンネルに加入関係を保存し、退会は削除
のすべてのモードを購読します辞書に関係redisServer pubsub_patternsを保存し、パターンマッチング文字は、クライアントおよび関連情報を含んでいます

12.物事

マルチは、幹部を通じて達成するために物事を見て、他の
プロセス実行1.サーバーマルチ指令を受け、オープン何か、2セットのような他のを入力します\コマンドを取得し、幹部が提出入力します
事務のクライアントの状態をサーバーにコマンドを受信し、マーク後に、それは、クライアントが事務の状態にあるかどうかが決定される、オブジェクトの状態は、コマンドキュー(FIFO)、コマンド実行EXECまでキューがクライアント(サーバーレコード)にコマンド
execの監視を実行する前に、楽観的ロックを見ますデータベース、変更されたキーは、物事を運ぶことを拒否し、空を返し
、エラーのexecコマンドはすべてのものを実行しません提出し、エラーは、あなたが幹部を提出することができ、物事のいくつかは、エラーコマンドが実行されていない場合、他は引き続き、物事をキャンセル

13.Luaスクリプト

RedisのLUAスクリプトは、疑似クライアントに含まれるコマンドを実行し、すべてのロードされた辞書を保存するためにスクリプトを使用するのevalコマンドが実行されたか、スクリプトのロードスクリプトに
スクリプトを実行する関数を呼び出し、evalのコマンドスクリプトは、クライアントの入力機能を定義する
ように:evalの"リターンredis.call( '・デル・ '(redis.call( 'キー'、ARGV [1]))解凍)" 0 'USER_ID_ *'を
USER_ID_の先頭にすべてのキーを削除するには

14.並べ替え:SORTキーリストをコマンド、キーのセットやキースタディツアーの並べ替えの値を設定します

重要な要素が配列にロードされ、その後、配列をソート含んでいた、\ LIMIT BY、異なる結果を注文した後に返すために様々なオプションがあります\ \ ALPHA \ DESCの\ ASCをGET

15.バイナリアレイ

SDSは、保存最適化するために、ルックアップテーブルと可変精度SWARアルゴリズムを使用して中央値グループ、BITCOUNTアルゴリズムを逆に保存するために使用されます

16.スロークエリーログ:このことによって生成されたクエリ速度ログ機能を監視および最適化するためのコマンド要求の所定の期間を超えてからの記録の実行時間

設定slowlogを-ログ遅いよりもマイクロ秒:コマンド実行時間をログ記録するためにマイクロ秒数を超えて
指定されたサーバにどのように多くのスロークエリログストアアップ:のslowlog-MAX-LEN数を

関連情報コマンド実行クライアントモニタ、自分のモニター、プリントサーバになり、現在の要求のリアルタイム処理を受け取ります。17.モニター

192.168.37.134:8340>監視
OK
1569290062.401279 [0 192.168.37.1:60115] "AUTH" "admin.1231"
1569290062.402377 [0 192.168.37.1:60115] "PING"
1569290062.403760 [0 192.168.37.1:60115] "INFO"」 ALL」
1569290063.409147 [0 192.168.37.1:60115] "HH "" "T"を設定"
1569290075.303194 [0 192.168.37.1:60115] " "HH"" "TT"に設定

おすすめ

転載: www.cnblogs.com/lantuanqing/p/11577234.html