在對外提供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視頻教程。