次のコラム Redis チュートリアル では、同時リクエストを防ぐための Redis アトミック カウンター incr について紹介します。
1. はじめに
フラッシュ セール活動や、現在のユーザー数が多すぎる Web サイトなど、大量の同時リクエストに制限がある一部のシステムまたは機能では、次のことを行ってください。後で試してください。これらは同時にリクエストの数を制限し、通常はバックグラウンド システムを保護し、過剰なトラフィックの影響によるシステムのクラッシュを防ぐために使用されます。システムクラッシュの結果に関しては、メンテナにとっては、一部のリクエストを拒否する方が明らかに受け入れられます。
現状の様々な制限の中で、システム自身で設計したロック機構を備えたカウンターに加えて、Redis を使用して実装することが効率的で安全かつ便利な方法であることは明らかです。
2. Incr コマンド
Redis Incr コマンドは、key に格納されている数値を 1 つ増やします。
key が存在しない場合は、まず key の値が 0 に初期化されてから、INCR 操作が実行されます。
値に間違った型が含まれている場合、または文字列型の値が数値として表現できない場合は、エラーが返されます。
この演算の値は、64 ビット (ビット) の符号付きデジタル表現に制限されます。
例:
127.0.0.1:6379> set num 10 OK 127.0.0.1:6379> incr num (integer) 11 127.0.0.1:6379> get num # 数字值在 Redis 中以字符串的形式保存 "11"
注: Redis には整数データを表す明確な型がないため、この操作は文字列操作になります。
この操作を実行すると、キーに対応して格納された文字列が 10 進数の 64 ビット符号付き整数データに解析されます。
実際には、Redis は内部的に整数表現 (整数表現) を使用して対応する整数値を格納するため、このタイプの文字列値は実際には整数に格納されるため、整数を格納するための文字列表現 (文字列表現) はありません。引き起こされた。
3. 使用シナリオ
1. カウンタ
使用方法のアイデアは、関連する操作があるたびに、Redis サーバーに incr コマンドを送信するというものです。
たとえば、これはシナリオです。Web アプリケーションがあり、各ユーザーが毎日この Web サイトにアクセスする回数を記録したいと考えています。
Web アプリケーションは、ユーザー ID と現在時刻を表す文字列をキーとして連結し、ユーザーがこのページにアクセスするたびにこのキーに対して incr コマンドを実行するだけで済みます。
このシナリオには多くの拡張メソッドを含めることができます。
INCR コマンドと EXPIRE コマンドを組み合わせることで、指定された間隔内のユーザーの訪問数のみを記録するカウンターを実装できます。
クライアントは次のことができます。 pass GETSET コマンドは現在のカウンタ値を取得し、それを 0 にリセットします
DECR や INCRBY などのアトミックな増減コマンドにより、ユーザーの操作に応じて特定の値を増減させることができます。 、ユーザーのゲーム スコアを計算する必要があります。リアルタイム制御では、スコアが増減する可能性があります。
2. 速度リミッター
速度リミッターは、特定の操作の実行速度を制限できる特別なシナリオです。
従来の例は、特定のパブリック API に対するリクエストの数を制限することです。
次の問題を解決するとします。API のリクエスト数を IP ごとに 1 秒あたり 10 件以下に制限します。
この問題は、incr コマンドを使用する 2 つの方法で解決できます。
4. フロー制御の Java 実装
ここでは、Java の redis-incr 機能を使用して、1 分間に 100 リクエストのみを許可する制御コードを構築します。キーは、redis に格納されている値を表します。制御されているキーの値。
以上が同時リクエストを防ぐための Redis アトミックカウンター incr の導入の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。