REDISによるAPI呼び出しの数を制限する

外部で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ビデオチュートリアルの最も完全なセットを作成します。


手続きの新しいビジョン

パブリック アカウント New Vision of Program」は、ソフトパワーとハードテクノロジーを同時に改善できるプラットフォームです。

WeChat公式アカウント:プログラムの新しいビジョン

おすすめ

転載: blog.csdn.net/wo541075754/article/details/107148931