#この記事の知識ポイント
期限切れデータの概念データ削除戦略エビクション アルゴリズム
期限切れのデータ
# まず、3 つの主要な値、つまり性別、名前、年齢を見てみましょう。
これら 3 つの値を設定する手順は、
set name kaka setex age 100 24 setex sex 10 1
## です。
redis では、ttl を使用して特定のキーのステータスを取得できます。
ttl
を使用して上記を取得しましょう名前、年齢、性別のステータスについては、
、-1 775 -2
の 3 つの値が表示されます。
では、これら 3 つの値によって得られる情報は何でしょうか。
- #-1 は永続的に有効なデータを表します
- 775 この値は年齢に設定され、使用されるコマンドは
setex age 1000 です24
(残りの有効期限として表されます)
- -2 は、期限切れのデータ、削除されたデータ、または定義のないデータを示します
期限切れデータのストレージ構造
- 時間制限を設定する場合 名前を指定すると、redisメモリ アドレス 0x10101
- を格納すると、redis は時間に敏感なキー
# を格納するために別のスペースを開きますが、格納方法はキーと有効期限に対応するメモリ アドレスです-
#今日私たちが話している Redis 削除戦略は、削除されたデータです。
スケジュールされた削除
スケジュールされた削除では、タイマーを書き込み、キーの時間が期限切れになると、タイマー タスクによって期限切れのキーがすぐに削除されます
# 利点: 有効期限が切れるとキーが削除されることは想像できると思いますが、間違いなく最もメモリに優しく、メモリを節約できます。 # 欠点: redis のシングルスレッド機能は、すべてのコマンドが特定の順序で実行されることです。有効期限が切れたときにキー値を削除すると、CPU への負担が大きくなり、Redis サーバーの応答時間と IO に直接影響します。
スケジュールされた削除は、スペースと引き換えに時間を使用することを意味します。
スケジュールされた削除が完了すると、キー値に対応するデータが削除され、有効期限が切れたメモリ領域も直接削除されます。
遅延削除
ぜひ見に来てくださいこの画像は、キー値の有効期限が切れてもすぐには削除されません。いつ削除されますか?読み続けてください###
#遅延削除を使用すると、データは有効期限が切れても自動的に削除されないため、削除方法は次のようになります。次回キー値を取得したときに、キーの有効期限が切れているかどうかが判定され、期限切れの場合は削除されます。
つまり、再度 get name が実行されると、関数が実行されます。
expirelfNeeded() この関数は、キーが存在するかどうかを判断するものです。期限切れ。有効期限が切れたら nil を返し、メモリから削除します
##利点: 一定量のCPU のパフォーマンス。削除する必要がある場合にのみ削除されます。
欠点: ホット スポットの後に、ホット ニュースなど、メモリ負荷が高いことが考えられます。は終了しました。ほとんど誰もアクセスしません。このキーは、誰もアクセスしない限り常に存在し、長期間にわたって一定量のメモリ領域を占有します。
#つまり、この方法はスペースと時間を交換することです
定期的に削除します
上で 2 つの削除方法について説明しました。1 つはスケジュールされた削除で、もう 1 つは遅延削除です。 1つは、空間と時間を交換することです。 1つは、時間をスペースと引き換えにすることです。どちらのオプションも比較的極端なアプローチです。次に、定期削除の実施計画を見てみましょう。
まず、redis のストレージ容量を見てみましょう。デフォルトでは 16 個あります。redis.conf には、このパラメータによって制御される構成パラメータ データベースがあります。各データベースには独自の有効期限パーティションがあり、データ アドレスとデータ有効期限時刻が保存されます。
#実装方法
redis が起動しますこのとき、サーバーの hz の値が読み取られます。デフォルトは 10 です。この値は、
info サーバー
を使用してターミナルで直接表示できます。
その後、サーバーは、serverCron() ポーリングのために 1 秒あたり Hz 回実行されます
使用を継続します16 個の Redis ライブラリの情報に 1 つずつアクセスするには、databasesCron を使用します。各実行時間は 250 ミリ秒 / サーバー ヘルツです。このパラメータ
各有効期限[*]を 1 つずつテストする場合、テストのために ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC がランダムに選択されます
キーがタイムアウトになった場合は、キーを直接削除します
1 ラウンドで削除されたキーの数>ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC*25% がプロセスを循環し続けます
1 ラウンドで削除されたキーの数<=ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC- 25% の場合は、次の有効期限が切れることを確認します[
]-
-
##次に、問題は、この時点で 250ms/hz が実行されていますが、16 個のデータベースの期限が切れていない場合はどうすればよいでしょうか?次回はどの図書館に行ってみようかな?実際、この値は存在しており、current_db の値です。この値は activeExpireCycel を記録し、次回 Expires[*]
になったときに実行します。
特徴 1: CPU 使用率のピークなし、検出頻度のカスタム設定
特徴 2 : メモリ負荷はそれほど高くはなく、長時間占有されていたメモリは継続的にクリーンアップされます
エビクション アルゴリズム
## 上で 3 つの削除戦略について説明しましたが、これら 3 つの戦略は、有効期間が設定されたキーに対してのみ有効です。
Redis が使用するメモリが不十分なため、エビクション ポリシーを使用して Redis が通常どおり使用できるようにします。
Redis は、freeMemorylfNeeded() を呼び出して、各コマンドを実行する前にメモリが十分であるかどうかを確認します。メモリが不足している場合は、いくつかのキーがクリアされます。このデータ クリア戦略は次のとおりです。立ち退き政策と呼ばれます。
redis の最大使用可能メモリのパラメータは maxmemory です。デフォルトは 0 です。占有される物理メモリの割合を指します。通常は 50 に設定されます。 %.
##
毎回削除するキーの数を選択します: maxmemory-samples
削除ポリシー: maxmemory-policy
削除戦略に焦点を当てましょう
- 揮発性データの検出 (つまり、有効期間を設定しましたが、有効期間はまだ設定されていません)期限切れまだ データは期限切れ[*]です (上記)
- volatile-lru: 最近使用したデータを選択します
- volatile-lfu: 最近使用したデータの数を選択します最小限のデータを使用します
- volatile-ttl: 削除するデータを選択します
- volatile-random: ランダムに選択します
# #次の写真を見てください
- 9秒は現在時刻です
- 9秒からの距離が最も長いキーは年齢です
- 使用量が最も少ないキーは性別です
- 次のとおりの場合volatile-lru は年齢を削除します
#volatile-lfu をフォローすると性別が削除されます-
#すべてのデータを検出 -
allkeys-lru: 最も最近使用されていないデータを選択します
allkeys-lfu: 最も最近に使用されていないデータを選択します - allkeys-ランダム: データベース全体をランダムに使用します。 削除
-
-
データのエビクションを放棄します。
no-enviction: データは削除されません。メモリが使い果たされるまで削除されるため、oom エラーが発生します。
概要
上記は、データの Redis の削除戦略とエビクション戦略です。 。
ここで注意すべき点は、エビクション ポリシーでは、揮発性データは有効期限が設定されたキーを指し、永続的な値ではないということです。
データベース全体は、有効期限と永続的なデータセットを含むすべての値を参照します。
以上がRedis の削除ポリシーとエビクション ポリシーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。