すべての Redis データ構造は有効期限の設定をサポートしています。期限が切れると、Redis はデータ構造を自動的に削除します。 Redis の内部には死神がいて、有効期限が設定されたすべてのキーを常に監視し、寿命に達するとすぐにキーを収穫すると想像できます。
Death の観点から、同時に期限切れになるキーが多すぎて処理できないかどうかを検討できます。同時に、Redis はシングルスレッドであるため、ハーベスティング時間もスレッドの処理時間に影響を及ぼし、ハーベスティングが忙しすぎると、オンラインの読み取りおよび書き込み命令に遅延が発生します。
redis は、有効期限が設定された各キーを独立した辞書に配置します。この辞書は定期的に走査され、期限切れのキーが削除されます。スケジュールされたトラバーサルに加えて、期限切れのキーを削除する遅延戦略も使用します。いわゆる遅延戦略とは、クライアントがキーにアクセスするときに、redis がキーの有効期限をチェックし、有効期限が切れた場合はすぐに削除することを意味します。スケジュールされた削除は集中的なプロセスですが、遅延削除は散発的なプロセスです。
Redis は、デフォルトで有効期限スキャンを 1 秒あたり 10 回実行します。有効期限スキャンは、有効期限ディクショナリ内のすべてのキーを走査するのではなく、単純な貪欲戦略を使用します。
期限切れの辞書から 20 個のキーをランダムに選択します;
これら 20 個のキーの中から期限切れのキーを削除します;
期限切れのキーの比率が 1/4 を超える場合は、手順 1 を繰り返します。 ;
同時に、期限切れのスキャンによって過剰なサイクルが発生したり、スレッドがスタックしたりしないようにするために、アルゴリズムはスキャン時間の上限も増加させます (デフォルトでは 25 ミリ秒を超えません)。
大規模な Redis インスタンス内のすべてのキーが同時に期限切れになったら、何が起こるでしょうか?
Redis が期限切れの辞書のスキャンを継続し (複数回サイクル)、期限切れの辞書内の期限切れのキーがスパースになる (サイクル数が大幅に減少する) まで停止しないことは間違いありません。これにより、オンラインの読み取りおよび書き込みリクエストに明らかな遅延が発生します。遅延のもう 1 つの理由は、メモリ マネージャーがメモリ ページを頻繁に再利用する必要があるため、ある程度の CPU 消費が発生することです。
##クライアント リクエストが到着したときに、サーバーがたまたま期限切れのスキャン状態になった場合、クライアントのリクエストは処理するまで少なくとも 25 ミリ秒待機します。クライアントがタイムアウト期間を比較的短く設定している場合;以上がRedis の有効期限戦略とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。