Redis除去戦略

Redisには有効期限を設定する機能があります。つまり、redisデータベースに格納されている値に有効期限を設定できます。キャッシュデータベースとして、これは非常に実用的です。たとえば、一般的なプロジェクトのトークンや一部のログイン情報、特にSMS検証コードには時間制限があり、従来のデータベース処理方法では、通常、それ自体が期限切れと判断されます。

鍵を設定するときに、有効期限である有効期限を指定できます。有効期限までに鍵が存続できる時間を指定できます

 

期限切れのデータ:Redisはメモリレベルのデータベースで、すべてのデータはメモリに保存されます。メモリ内のデータはTTL命令によって取得できます。

XX:時間依存データ-1:永久に有効なデータ-2:期限切れのデータまたは削除されたデータまたは未定義のデータ

 

経年変化データの格納構造

 

 

 

データ削除戦略の目標:メモリ使用量とCPU使用量のバランスを見つける。バランスが失われると、Redisの全体的なパフォーマンスが低下し、サーバーのダウンタイムやメモリリークが発生することさえあります。

データ削除戦略:定期削除+定期削除+遅延削除

  時限削除:タイマーを作成します。キーに有効期限があり、有効期限が到来すると、タイマータスクはすぐにキーを削除します

       利点:メモリを節約し、その時点でメモリを削除して、不要なメモリ占有をすばやく解放します

       短所:この時点でのCPUの負荷がいくら高くても、CPUの負荷は非常に大きく、CPUを占有するため、Redisサーバーの応答時間とコマンドのスループットに影響します。

       要約:プロセッサパフォーマンスのトレードス​​ペース

  定期的な削除:Redisはデフォルトで、有効期限が100ミリ秒ごとにいくつかのキーをランダムに抽出し、期限が切れているかどうかを確認し、期限が切れている場合は削除します。これはランダムに選択されることに注意してください。なぜランダムなのですか?redisが数十万のキーを保存し、100msごとに有効期限を設定するすべてのキーをトラバースすると、CPUに大きな負荷がかかります。

     有効期限[i]私は図書館を表します  

     Redisがサーバーの初期化を開始するとき、構成server.hzの値を読み取ります。デフォルトは10です。

     server.hz serverCron()-> databasesCron()-> activeExpireCycle()を毎秒実行します

     activeExpireCycle()は、各有効期限[*]を1つずつチェックし、毎回250ms / server.hzを実行します 

     特定の有効期限[*]の検出について、Wキーをランダムに選択して検出します。キーがタイムアウトした場合はキーを削除します。ラウンドで削除されたキーの数> W * 25%の場合は、プロセスを循環させます。キーがラウンドで削除された場合<= W * 25%の数、次の有効期限[*]を確認、0〜15サイクル(デフォルト値が16に設定されている場合)

     W値= ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性値

     パラメータcurret_dbは、activeExpireCycle()が実行のために入力する期限切れを記録するために使用されます[*]

     activeExpireCycle()の実行時間が期限切れになった場合、次回はcurrent_dbから実行を継続します

     

    redisライブラリーの時間依存データを定期的にポーリングし、ランダム抽出戦略を採用し、期限切れデータの比率を使用して削除の頻度を制御します

    機能1:CPUパフォーマンス占有設定にピーク値があり、検出頻度をカスタマイズできます。

    機能2:メモリの負荷はそれほど大きくなく、長時間メモリを消費するコールドデータは継続的にクリーンアップされます

    概要:定期的にストレージスペースを確認する

 

  遅延削除:定期的に削除すると、期限が切れたときに多くの期限切れのキーが削除されない可能性があります。したがって、遅延削除があります。期限切れのキーが通常の削除で削除されない場合は、システムがキーをチェックしない限りメモリに残り、redisで削除されます。これは遅延削除と呼ばれます。expireIfNeeded()、データが期限切れかどうかを確認し、getが実行されたときに呼び出します

      利点:CPUパフォーマンスを節約し、削除する必要がある場合にのみ削除する

      短所:メモリの負荷が非常に大きく、長時間メモリを占有するデータがある

      概要:プロセッサーのパフォーマンスと引き換えにストレージスペースを使用します(ランダムスポットチェック、主要スポットチェック)

 

 

 

 

 

立ち退きアルゴリズム

新しいデータエントリの検出:新しいデータがredisに入るとき、メモリが不足している場合はどうなりますか?

Redisはメモリを使用してデータを格納します。各コマンドを実行する前に、redisはfreeMemoryIfNeeded()を呼び出してメモリが十分かどうかを確認します。メモリが新しく追加されたデータの最小ストレージ要件を満たしていない場合、redisは一時的に一部のデータを削除して、現在の命令のストレージスペースをクリアします。データを消去する方法は、立ち退きアルゴリズムと呼ばれます。

注:データの追い出しのプロセスは、十分な使用可能なメモリ空間をクリアするための100%ではありません。それが成功しない場合、繰り返し実行されます。すべてのデータを試した後、メモリクリーニングの要件を満たせない場合は、エラーメッセージが表示されます。

(err)使用メモリ> 'maxmemory'の場合、OOMコマンドは使用できません

 

使用可能な最大メモリmaxmemory:占有されている物理メモリの割合。デフォルト値は0で、制限がないことを意味します。通常50%以上に設定

削除するデータの数を選択するたび:maxmemory-samplesデータを選択するとデータはスキャンされないため、パフォーマンスが大幅に低下し、読み取りと書き込みのパフォーマンスが低下します。そのため、ランダムにデータを取得する方法が、検出、削除されるデータとして使用されます。

削除戦略:maxmemory-policyが最大メモリに達した後、選択したデータを削除する戦略

 

Redisのメモリ消去メカニズムRedisは、6つのデータ消去戦略を提供します。

 

配置:maxmemory-policy volatile-lru

 

揮発性データを検出する(期限切れの可能性があるデータセットserver.db [i] .expires)

volatile-lru->削除する有効期限が設定されているデータセットから、最も長く使用されていないデータを選択します

volatile-lfu->削除する有効期限が設定されているデータセットから最も使用頻度の低いデータを選択します

volatile-ttl->有効期限が設定されているデータセットから、有効期限が近づいているデータを選択します

volatile-random->有効期限が設定されているデータセットからデータの削除を任意に選択

 

データベース全体のデータをチェックします(すべてのデータセットserver.db [i] .dict)

allkeys-lru->新しく書き込まれたデータを格納するのに十分なメモリがない場合は、キースペースで、最も長く使用されていないキー(最も一般的に使用される)を削除します

allkeys-random->データセットからのデータ削除を任意に選択

allkeys-lfu->メモリが新しく書き込まれたデータを収容するのに十分でない場合、キースペースで最も使用頻度の低いキーを削除します

 

データの削除を中止する

no-eviction->データの排除を禁止します(redis4.0のデフォルト戦略)。つまり、新しく書き込まれたデータを格納するのに十分なメモリがない場合、新しい書き込み操作またはエラーが報告され、OOM(メモリ不足)になります。

 

infoコマンドでキャッシュヒットの数を確認できます

 

おすすめ

転載: www.cnblogs.com/liushoudong/p/12679174.html