外部でAPIインターフェースを提供する場合、APIインターフェースを制限する必要がある場合が多く、場合によっては、インターフェースがブラッシングされないようにする必要もあります。この機能は、redisの自動増加カウント機能を使用して簡単に実現できます。
Springブートおよび他のプロジェクトでのredisの統合についてはあまり触れません。ここでは、シナリオでのredisの使用について説明します。指定された期間内にAPIに対応するメソッドが呼び出された回数を確認し、制限を超えている場合はtrueを返し、ルールをトリガーして、その他の場合は戻ります。偽。
プロジェクトはspringbootに基づいています。最初に、対応するしきい値構成を定義します。
close:
# 封号时间区间,默认1秒,单位秒
seconds: 1
# api调用次数,默认3次,达到3次则封号。
times: 3
1秒間定義され、3回呼び出されると、ルールがトリガーされます。
構成ファイルは対応するクラスに挿入されます。
@Value("${close.seconds}")
private int closeSeconds;
@Value("${close.times}")
private int closeTimes;
次に、redisTemplateを挿入し、redisのキープレフィックスを定義します。
public static final String CLOSE_LIMIT_PRE = "close_limit_pre_";
@Resource
private RedisTemplate<String, Object> redisTemplate;
以下は、コアツールの検証方法です。
/**
* 统计单位时间内,请求次数
*
* @param userId 用户ID
* @param method 方法
* @return
*/
protected boolean isClose(Long userId, String method) {
String key = CLOSE_LIMIT_PRE + userId + "_" + method;
Long count = redisTemplate.opsForValue().increment(key, 1);
if(count == 1){
redisTemplate.expire(key, closeSeconds, TimeUnit.SECONDS);
return false;
} else if(count >= closeTimes){
return true;
} else {
return false;
}
}
キーはユーザーIDとメソッド名のパラメーターによってスプライスされます。もちろん、特定のシナリオに従って変更を加えることができます。
増分で初期化するか、値に1を追加します。redisに値が存在しない場合、キーの値は1に初期化され、存在する場合は1だけ増分され、値が返されます。初期化されていない場合、呼び出しはカウント値1を返し、この時点で有効期限が設定されます。その他の場合は、回数が制限を超えているかどうかを比較し、超えている場合はtrueを返し、呼び出し側がそれを処理します。
元のリンク:「REDISによるAPI呼び出しの数の制限」
ファインスプリングブート2.xビデオチュートリアル
「Spring Boot 2.xビデオチュートリアルファミリーバケット」、Spring Boot 2.xビデオチュートリアルのブティックで、Spring Boot 2.xビデオチュートリアルの最も完全なセットを作成します。