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コマンドでキャッシュヒットの数を確認できます