Redis内部動作メカニズムの詳細

3264 ワード

Redisデータベース
Redisサーバが初期化されるとredisが作成されます.h/REDIS_DEFAULT_DBNUM(後述N)個のデータベースである、データベースのidは0からN-1であり、すべてのデータベースはredisに保存する.h/redisServer.db配列にあります.
クライアントでは「SELECT」コマンドで切り替えることができ、プログラムは直接redisである.h/redisServer.db[number]を切り替えます.しかし、AOFプログラム、レプリケーションプログラム、RDBプログラムなどの内部プログラムでは、現在のデータベースの番号を知る必要があり、idドメインがなければ、プログラムは現在使用するデータベースのポインタとredisServerしかない.db配列のすべてのデータベースのポインタを比較して、自分が使用しているデータベースを明らかにします.
Redisデータベースの構造:
typeof  struct   redisDb{
int id ;   //     id

dict *dict ; //                      

dict *expires ; //          

…..

} redisDb ;
 Redis           ,  Redis                
      
        、list   、 hash、             

Redisデータベースの追加、削除、変更、検索などの操作のキー空間操作:
≪新規|New|emdw≫:Redisは、キー空間辞書にキーと値のペアを追加します.キーは文字列で、値は任意の値タイプです.削除:Redisは、キー空間辞書から対応するキーのキー-値ペアの更新を削除します:Redisは、キー空間辞書から解放される前に対応するキーの値オブジェクトを指定し、キーを新しい値オブジェクトに向けてクエリーします:Redisは、キー空間辞書で対応するキーの値オブジェクトをクエリーします:キーが存在せず、NULLキーが存在し、タイプが正しく、正しい値キーが存在しますが、タイプが正しくありません.戻りタイプエラーその他の操作:上に示すキー値操作のほか、データベース自体に対するコマンドもたくさんあります.また、FLUSHDB削除キー空間内の全てのキー値対RANDOMKEYがキー空間からランダムに1つのキーDBSiZE戻りキー空間内のキー値対の数EXISTSがキー空間内に存在するか否かをチェックし、所与のキーを名前変更する
キーの有効期限
Redisデータベースでは、すべてのキーの有効期限はRedisDb構造体のexpires辞書に保存され、キーはdict辞書(キー空間)内のキーを指すポインタであり、値はリノベーションの有効期限であり、long long型で表される.
Redisには4つのコマンドがあり、キーの生存時間(どのくらい生存できるか)と期限切れ時間(いつ期限切れになるか):EXPIREは秒単位でキーの生存時間を設定します.PEXPIREは、キーの生存時間をミリ秒単位で設定する.EXPIREATは秒単位で、キーの期限切れUNIXタイムスタンプを設定します.PEXPIREATは、キーの有効期限切れUNIXタイムスタンプをミリ秒単位で設定します.
さまざまな単位や形式の設定がありますが、expires辞書の値には「ミリ秒単位の期限切れUNIXタイムスタンプ」しか保存されていません.つまり、変換を行うことで、すべてのコマンドの効果は最後にPEXPIREATコマンドの効果と同じになります.
期限切れキーのクリア
タイミングクリア:KEYが作成された時にタイミングタスクを作成し、KEYが期限切れになった時にタイミングタスクがトリガーされ、期限切れKEYが最初にクリアされる.このような操作はメモリに対して最も友好的で、ごみのデータがメモリを占有する情況が存在しない欠点は大きいサーバーの負荷をもたらすことができて、特にCPUの負荷が高い時、CPUの大部分の負荷は削除の不要なKEYの上で使いました
不活性クリア:キー空間のキーを放置し、KEYを問い合わせるたびに先にKEYが期限切れであるかどうかを検証し、期限切れであれば削除し、期限切れでなければ正常に対応するVALUEに戻る.このような操作はCPUにとって最も友好的で、このような策略は現在のKEYに限られて、関連する不要なKEYはCPU負荷の欠点をもたらさない:メモリ空間の浪費をもたらしやすくて、特にシステムの中で大量の期限切れのKEYが存在してしかもめったに使われない時、これは非常にメモリサイズのRedisの性能に依存することに影響します
定期削除:タイミングスクリプトcronタイミングでexpiresのキースキャンに対して期限切れのKEYが存在するかどうかを判断し、存在する場合は削除する.CPUの消費量が多すぎず、不活性なメモリ消費量が無視されている不要なメモリ消費量をタイミングよく削除できる折衷方式です.
Redisは、「不活性消去」と「定期的明確化」を組み合わせた方法を採用しており、定期削除モードは、所定の時間制限内に、できるだけ各データベースのexpires辞書を巡り、一部のキーの有効期限をランダムにチェックし、その有効期限キーを削除する.
疑似コードは次のとおりです.
def activeExpireCycle():
#      (          ,       )
for db in server.db:
# MAX_KEY_PER_DB     DB        key    #                DB  (    ) i=0                                    while (i < MAX_KEY_PER_DB):
#      ,   while ,     DB if db.is_empty(): break
#         TTL    
              key_with_ttl = db.expires.get_random_key()
#        ,     ,     if is_expired(key_with_ttl):
            db.deleteExpiredKey(key_with_ttl)
#          ,     ,     #                CPU   
if reach_time_limit(): return
i += 1

Redis期限切れキー削除のマスタースレーブ同期問題(Redisのメカニズムはマスターノードによって統一的に制御される)
サーバーがプライマリノードの場合、有効期限が切れたキーを削除すると、明示的にすべてのセカンダリノードにDELコマンドが送信されます.サーバーがセカンダリノードの場合、現在のKEYが有効期限が切れたと判断すると、キーの有効期限が切れたメッセージがプライマリサーバーに送信され、プライマリサーバーが削除された後、すべてのサーバーノードにDELコマンドが送信されます.
サーバノードからキーを自主的に削除するのは、プライマリ・サーバ・データとの絶対的な一貫性を維持するためであり、すなわち、期限切れのキーがプライマリ・サーバに存在する場合、このキーはすべてのセカンダリ・サーバから削除されません.