1. はじめに
記事を始める前に、質問させてください: コマンドを使用する場合: expire key Second
有効期限が切れたら、キーの有効期限を設定します。時間切れです。このキーに対応する 期限切れデータ
は本当にサーバーによってすぐに削除されますか?答えは、すぐには削除されないということです。この答えがわかったら、Redis で期限切れのデータがどのように処理されるかを見てみましょう。
2. Redis のデータ特性
Redis はメモリレベルのデータベースです。すべてのデータはメモリに保存されます。メモリ内のデータは、TTL 命令を通じてステータスを取得できます。 3 つの状態があります:
#命令結果 | 状態 |
XX# # 時間に依存するデータ |
|
-1
永続的に有効なデータ |
|
-2
は期限切れのデータ、削除されたデータ、または未定義のデータ |
|
3. 時間依存のデータストレージ構造
命令を使用して期限切れデータを設定すると、データに対応するアドレスが期限切れスペースに配置されます。保存方法はハッシュ、保存される値は有効期限です。
4. データ削除戦略
データ削除戦略の目標:
メモリ使用量と CPU 使用量のバランスを見つける。どちらかを考慮しないとパフォーマンスが低下します。全体的な Redis のパフォーマンスに影響を与える可能性があります。サーバーのダウンタイムやメモリ リークを引き起こす可能性もあります。
1. スケジュールされた削除
タイマーを作成します。キーに有効期限が設定されている場合有効期限に達すると、タイマーが使用されます。サーバー タスクはキーの削除操作を即座に実行します。
利点:メモリを節約し、次の時点で削除します。時間が来たら、不要なメモリ使用量をすぐに解放します
欠点: CPU には大きな負荷がかかっています。この時点で CPU 負荷がどれほど高くても、 CPU が占有されているため、Redis サーバーの応答時間と命令のスループットに影響します
2. 遅延削除
- ##データが有効期限に達した場合、処理は行われません。次回データにアクセスすると、
expireIfNeeded() 関数が呼び出され、データの有効期限が切れているかどうかが判断されます。期限切れでない場合は、データを返し、有効期限が切れていることを確認して削除し、戻ります。存在しません
利点: CPU パフォーマンスを節約し、削除する必要があるとわかった場合にのみ削除します
欠点: メモリ負荷が非常に高く、データが長時間メモリを占有しているように見えます
3. 定期的な削除
プロセス分析 :
- Redis サーバーの起動と初期化時に、構成サーバーの値を読み取ります.hz、デフォルトは 10
- で、その後は毎秒
serverCron() メソッドを 10 回実行します。これは、サーバー
## の検出に使用されます。
- #serverCron()
メソッドは databasesCron( )
メソッドを呼び出します。このメソッドはデータベースを走査するために使用されます。Redis にはデフォルトで 16 個のデータベースがあります (最初のデータベースから順に)データベース
- databasesCron()
メソッド activeExpireCycle()
メソッドが再度呼び出され、各 expires[*] が検出されます。
1 つずつ、毎回 250ms/server.hz を実行; 特定の 有効期限が切れます [*]
検出中に、W 個のキーが検出のためにランダムに選択されます
キーのタイムアウトが検出された場合、キーは削除されます。1 ラウンドで削除されたキーの数 > W25% の場合、プロセスをループします。1 ラウンドで削除されたキーの数が ≤W25% の場合、次の - expires[*]
、0 ~ 15 ループ。 W 値 = ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 属性値
activeExpireCycle() の実行時間が期限切れになると、次回は current_db から実行が継続されます パラメータcurrent_db は、どの期限切れ[*] activeExpireCycle() が実行に入るかを記録するために使用されます。
通常削除
メモリを節約、占有なし |
期間に関係なく、高頻度でCPUリソースを占有します |
時間をスペースと交換します |
|
遅延削除
深刻なメモリ使用量 |
実行の遅延、CPU 使用率の高さ |
スペースを時間と引き換えに |
|
定期的な削除 メモリの定期的なランダム クリーニング |
メモリを維持するために 1 秒あたり一定量の CPU リソースを費やします |
ランダムかつ集中的なチェック |
|
6. エビクションアルゴリズム
1. 概念の紹介
新しいデータが Redis に入るとき、メモリが不足している場合はどうすればよいでしょうか? Redis はデータの保存にメモリを使用するため、各コマンドを実行する前に freeMemoryIfNeeded()
を呼び出してメモリが十分であるかどうかを確認します。メモリが新しく追加されたデータの最小ストレージ要件を満たしていない場合、redis は現在の命令用のストレージ領域をクリアするために一部のデータを一時的に削除します。データをクリーニングするための戦略は、エビクション アルゴリズムと呼ばれます。
注: データの削除プロセスは、使用可能な十分なメモリ領域を 100% クリアすることはできません。失敗した場合は、繰り返し実行されます。すべてのデータを試した後、メモリのクリーンアップ要件を満たせない場合は、エラー メッセージが表示されます。
2. 8 つの構成
揮発性データの検出 (server.db[i].expires
期限切れになる可能性のあるデータ セット)
#volatile-lru | 削除する最も最近使用されていないデータを選択します |
##volatile-lfu
削除する最も最近使用されていないデータを選択してください |
| ##volatile-ttl
#期限切れになるデータを選択してください##volatile -random
ランダムにデータを選択して削除します |
|
データベース データ全体を検出します (すべてのデータ セットserver.db[i].dict | ) |
allkeys-lru削除する最も最近使用されていないデータを選択します
allkeys-lfu
削除する最も最近使用されていないデータを選択してください |
|
allkeys-random
削除するデータを選択してください |
|
データのエビクションを放棄する: |
|
no-envictionデータのエビクションを無効にする (redis4.0 のデフォルト ポリシー)
以上がRedis 削除戦略の 3 つの方法とエビクション アルゴリズムの例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。