通過REDIS實現限制API調用次數

在對外提供api接口時,往往需要對api接口進行限制,某些情況下還需要做好防止接口被刷的功能。利用redis的自增計數特性可以很輕易的實現該功能。

關於Spring boot等項目集成redis就不再多說,這裏提供一種場景下redis的使用:在指定時間段檢查api對應方法被調用的次數,如果超出該限制則返回true,觸發規則,其他情況返回false。

項目基於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的key前綴。

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和方法名稱參數拼接key,當然根據你的具體場景可以進行變通。

通過increment來初始化或對值加1,如果redis中不存在該值,則對該key的值初始化爲1,如果存在則進行加1並返回值。當未初始化時,調用返回count值爲1,此時設置失效時間。其他情況則比較次數是否超過限制,如果超過則返回true,由調用方進行具體處理。

原文鏈接:《通過REDIS實現限制API調用次數

精品SpringBoot 2.x視頻教程

《Spring Boot 2.x 視頻教程全家桶》,精品Spring Boot 2.x視頻教程,打造一套最全的Spring Boot 2.x視頻教程。


程序新視界

公衆號“程序新視界”,一個讓你軟實力、硬技術同步提升的平臺

微信公衆號:程序新視界

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章