Redis の有効期限戦略について説明する記事
この記事では、Redis の有効期限戦略を紹介し、遅延削除戦略と定期削除戦略の実装方法を説明します。
有効期限を保存する
Redis は各キーの有効期限を設定でき、各キーを有効期限とともに保存します。 set. を別の辞書に追加します。 [関連する推奨事項: Redis ビデオ チュートリアル ]
typedef struct redisDb { int id; //id是数据库序号,为0-15(默认Redis有16个数据库) long avg_ttl; //存储的数据库对象的平均ttl(time to live),用于统计 dict *dict; //存储数据库所有的key-value dict *expires; //存储key的过期时间 dict *blocking_keys;//blpop 存储阻塞key和客户端对象 dict *ready_keys;//阻塞后push 响应阻塞客户端 存储阻塞后push的key和客户端对象 dict *watched_keys;//存储watch监控的的key和客户端对象 } redisDb;
dict は、Redis データベースに含まれるすべての Key-Value キーと値のペアを維持するために使用され、expires は Redis データベース内の設定を維持するために使用されます。有効期限のキー (つまり、キーと有効期限のマッピング)。 ここでの有効期限はミリ秒のタイムスタンプで表現されていることに注意してください。たとえば、2022-01-02 22:45:02 に有効期限が切れる場合、値は 1641134702000
expire コマンドを使用する場合、有効期限に達すると、Redis はまず dict ディクショナリ テーブルを検索して、設定するキーが存在するかどうかを確認し、存在する場合は、キーと有効期限が Expires ディクショナリ テーブルに追加されます。
setex コマンドを使用してシステムにデータを挿入すると、Redis はまずキーと値をディクショナリ テーブルの辞書に追加し、次にキーを追加し、ディクショナリ テーブルの有効期限が切れます。 setex は文字列にのみ使用できることに注意してください。
簡単に言うと、有効期限が設定されたキーと特定の有効期限はすべて、expires ディクショナリ テーブルに保持されます。有効期限の設定
expire の使用法
expired コマンドは次のように使用します。expired key ttl (unit127.0.0.1:6379> expire name 2 #2秒失效 (integer) 1 127.0.0.1:6379> get name (nil) 127.0.0.1:6379> set name zhangfei OK 127.0.0.1:6379> ttl name #永久有效 (integer) -1 127.0.0.1:6379> expire name 30 #30秒失效 (integer) 1 127.0.0.1:6379> ttl name #还有24秒失效 (integer) 24 127.0.0.1:6379> ttl name #失效 (integer) -2
秒に設定します。
pexpire コマンドを使用して、キーの有効期間を ttlミリ秒に設定します。キー key の有効期限を timestamp で指定された 秒 タイムスタンプに設定します。
pexpireat コマンドは、キー key の有効期限を timestamp # で指定された ミリ秒に設定するために使用されます。 ##タイムスタンプの数
expire、pexpire、およびexpiratの最終実装はすべてpexpireatによって実装されることに注意してください。つまり、クライアントによってどのコマンドが実行されても、Redisはそれをpexpireatコマンドに変換します。実行のために。したがって、expires ディクショナリに格納されている時刻は、ミリ秒のタイムスタンプで表されるキーの有効期限です。
有効期限ポリシー
キーの有効期限が切れた場合、いつ削除されますか?3 つの有効期限戦略があります
時間指定削除: キーの有効期限を設定する際に、キーの有効期限が切れたときにすぐに削除を実行できるようにタイマーを作成します。キー付属のキー削除操作です。 (
タイマー削除の作成)
- 遅延削除: キーの有効期限はそのままにしますが、キー スペースからキーを取得するたびに、取得したキーの有効期限が切れているかどうかを確認します。有効期限が切れている場合は、キーを削除します。有効期限が切れていない場合は、キーを返します。 (
- 使用する場合は削除します) 定期的な削除: プログラムは時々データベースをチェックし、期限切れのキーを削除します。削除する期限切れのキーの数とチェックするデータベースの数については、アルゴリズムによって決定されます。 (
- 定期的なスキャンと削除)
- 定期的な削除
利点
1.はい 最もメモリに優しい: タイマーを使用すると、期限切れのキーができるだけ早く削除され、占有されていたメモリが解放されます。- 欠点
- 遅延削除
利点
1. 最も CPU に優しい: キーは、キーが有効になった場合にのみ期限切れになります。削除されたキーはチェックされます。つまり、CPU を定期的にスキャンする必要がなく、多数のタイマーを作成する必要もありません。- 欠点
- 定期的な削除
利点
1. 定期的な削除では、期限切れのキー操作が時々実行され、期間と頻度を制限することで削除操作による CPU 時間への影響が軽減されます。削除操作の影響。- 2. 期限切れのキーを削除することで、期限切れのキーによるメモリの無駄を効果的に削減できます。
欠点 削除操作の期間と頻度を決定するのが困難です
1. 削除操作の実行頻度が高すぎるか、時間がかかりすぎる場合、定期的な削除戦略はスケジュールされた削除に変質し、CPU 実行時間が過度に消費されます。- 2. 削除操作にかかる時間が短すぎる場合、または実行時間が短すぎる場合、通常の削除戦略は遅延削除と同じになり、メモリが無駄に消費されます。
- キーの有効期限が切れている場合、expireIfNeeded 関数はキーを削除します
- キーの有効期限が切れていない場合、expireIfNeeded 関数は操作を実行しません。
Redis 有効期限戦略
Redis は 2 つの戦略を使用します: 遅延削除 と 定期的な削除 : これら 2 つの戦略を適切に構成して使用します。この戦略により、サーバーは CPU 時間の合理的な使用とメモリ領域の無駄の回避との間で適切なバランスをとることができます。
遅延削除戦略の実装
期限切れキーの遅延削除戦略は、db.c/expireIfNeeded 関数によって実装されます。データベースの書き込み Redis コマンドが実行される前に、expireIfNeed 関数が呼び出され、入力キーがチェックされます。
コマンドは、次に示すように、expireIfNeeded 関数のプロセスを呼び出します。
さらに、アクセスされた各キーは削除される可能性があるため、各コマンド Both はキーの有無の両方を処理できなければなりません。 次の図は、get コマンドの実行プロセスを示しています。
定期削除戦略の実装
定期的期限切れのキーの有効期限 削除戦略は、redis.c/activeExpireCycle 関数によって実装されます。Redis サーバーが redis.c/serverCron 関数を定期的に実行するたびに、activeExpireCycle 関数が呼び出されます。この関数は、サーバー内の各データベースを 1 回の期間内に複数回走査します。指定された時間。
Redis は、デフォルトで 1 秒あたり 10 回の有効期限スキャンを実行します。有効期限スキャンは、有効期限ディクショナリ内のすべてのキーを走査するのではなく、単純な貪欲戦略を採用します。手順は次のとおりです。
(1) 期限切れの辞書からランダムに 20 個のキーを選択します。
(2) この 20 個のキーのうち、期限切れのキーを削除します。
(3) 期限切れのキーの割合が 1/4 を超える場合は、手順 (1) を繰り返します。同時に、期限切れのスキャンがオーバーサイクルしてプロセスがフリーズしないようにするために、アルゴリズムによりスキャン時間の上限も増加します。デフォルトでは 25 ミリ秒を超えません。
大規模な Redis インスタンス内のすべてのキーが同時に期限切れになったら、何が起こりますか?
CPU の消費
Redis 期限切れの辞書期限切れの辞書内の期限切れのキーがスパースになるまでスキャン (複数回ループ) が続けられ、その後停止します (ループの数が大幅に減少します)。
リクエストの遅延またはタイムアウトが発生する
クライアント リクエストが到着したときに、サーバーがたまたま期限切れのスキャン状態になった場合、クライアントのリクエストは少なくとも 25 ミリ秒待機することになります。処理中、クライアントがタイムアウト時間を 10 ミリ秒など比較的短く設定すると、タイムアウトにより多数の接続が閉じられ、ビジネス エンドで多くの例外が発生します。有効期限に必ず注意してください。多数のキーが期限切れになる場合は、有効期限にランダムな範囲を設定する必要があり、すべてのキーを同時に期限切れにすることはできません。
プログラミング関連の知識について詳しくは、プログラミング入門
をご覧ください。 !以上がRedis の有効期限戦略について説明する記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

Redisデータをクリアする方法:Flushallコマンドを使用して、すべての重要な値をクリアします。 FlushDBコマンドを使用して、現在選択されているデータベースのキー値をクリアします。 [選択]を使用してデータベースを切り替え、FlushDBを使用して複数のデータベースをクリアします。 DELコマンドを使用して、特定のキーを削除します。 Redis-CLIツールを使用してデータをクリアします。

Redisのキューを読むには、キュー名を取得し、LPOPコマンドを使用して要素を読み、空のキューを処理する必要があります。特定の手順は次のとおりです。キュー名を取得します:「キュー:キュー」などの「キュー:」のプレフィックスで名前を付けます。 LPOPコマンドを使用します。キューのヘッドから要素を排出し、LPOP Queue:My-Queueなどの値を返します。空のキューの処理:キューが空の場合、LPOPはnilを返し、要素を読む前にキューが存在するかどうかを確認できます。

Redis指令を使用するには、次の手順が必要です。Redisクライアントを開きます。コマンド(動詞キー値)を入力します。必要なパラメーターを提供します(指示ごとに異なります)。 Enterを押してコマンドを実行します。 Redisは、操作の結果を示す応答を返します(通常はOKまたは-ERR)。

Redisを使用して操作をロックするには、setnxコマンドを介してロックを取得し、有効期限を設定するために有効期限コマンドを使用する必要があります。特定の手順は次のとおりです。(1)SETNXコマンドを使用して、キー価値ペアを設定しようとします。 (2)expireコマンドを使用して、ロックの有効期限を設定します。 (3)Delコマンドを使用して、ロックが不要になったときにロックを削除します。

Redisソースコードを理解する最良の方法は、段階的に進むことです。Redisの基本に精通してください。開始点として特定のモジュールまたは機能を選択します。モジュールまたは機能のエントリポイントから始めて、行ごとにコードを表示します。関数コールチェーンを介してコードを表示します。 Redisが使用する基礎となるデータ構造に精通してください。 Redisが使用するアルゴリズムを特定します。

Redisコマンドラインツール(Redis-Cli)を使用して、次の手順を使用してRedisを管理および操作します。サーバーに接続し、アドレスとポートを指定します。コマンド名とパラメーターを使用して、コマンドをサーバーに送信します。ヘルプコマンドを使用して、特定のコマンドのヘルプ情報を表示します。 QUITコマンドを使用して、コマンドラインツールを終了します。

Redisデータ損失の原因には、メモリの障害、停電、人的エラー、ハードウェアの障害が含まれます。ソリューションは次のとおりです。1。RDBまたはAOF持続性を使用してデータをディスクに保存します。 2。高可用性のために複数のサーバーにコピーします。 3。Hawith redis sentinelまたはredisクラスター。 4.データをバックアップするスナップショットを作成します。 5.永続性、複製、スナップショット、監視、セキュリティ対策などのベストプラクティスを実装します。
