基於Redis的限流器的實現
阿新 • • 發佈:2019-02-07
1 概述
系統中的介面通常都有限流,比如 70次/秒 ,如何保證我們的介面的呼叫次數在超過第三方介面限流的時候快速失敗呢?這時候就需要限流器了。下面是筆者用redis實現限流器的流程圖。
2 程式碼
/**
* 獲取限流許可權
* @param key
* @param millisecond 毫秒數
* @param limitCount 限流次數
* @return
*/
public static boolean getCurrentLimiting(String key, Long millisecond, Integer limitCount){
try {
boolean currentLimitingLock = RedisDistributeLockUtil.lock(key);
if(currentLimitingLock){
Long llen = RedisClient.llen(getCurrentLimitingRedisKey(key));
if(llen < limitCount){
RedisClient.lpush(getCurrentLimitingRedisKey(key), DateUtil.current(false) + "");
return true;
}else{
Long lastTime = Long.parseLong(RedisClient.lindex(getCurrentLimitingRedisKey(key), -1));
if((DateUtil.current(false) - lastTime) >= millisecond){
RedisClient.lpush(getCurrentLimitingRedisKey(key), DateUtil.current(false ) + "");
RedisClient.ltrim(getCurrentLimitingRedisKey(key), 0, limitCount);
return true;
}
}
}
}finally {
RedisDistributeLockUtil.unlock(key);
}
return false;
}