限流算法之计数器法

/**
* 计数法限流
*/
public class CounterLimiter {

/**
* 限流时间段起始时刻
*/
private long currentTimeStart;
/**
* 限流时间段持续时长(单位:ms)
*/
private long limitPeriod;
/**
* 限流时间段访问次数上限
*/
private long limitTimes;
/**
* 限流时间段当前访问次数
*/
private long acceptTimes;

public CounterLimiter(long limitPeriod, long limitTimes) {
this.limitPeriod = limitPeriod;
this.limitTimes = limitTimes;
this.currentTimeStart = new Date().getTime();
this.acceptTimes = 0L;
}

/**
* 1.CounterLimiter对象初始化时刻作为第一个限流时间段起始时刻
* 若第一次访问时刻已超过初始限流时间段,重新开启一个限流时间段并初始化被访问次数,被访问次数+1,比较当前被访问次数和访问次数上限
* 若第一次访问时刻在初始限流时间段内,则被访问次数+1,比较当前被访问次数和访问次数上限
* 2.后续的任意一次访问,都会判断是否在当前限流时段内
* 若访问时刻在当前限流时段内,则被访问次数+1,比较当前被访问次数和访问次数上限
* 若访问时刻不在当前限流时段内,重新开启一个限流时间段并初始化被访问次数,被访问次数+1,比较当前被访问次数和访问次数上限
*/
public synchronized boolean requestAccess(){
if(currentTimeStart+limitPeriod<new Date().getTime()){
init();
}

if(acceptTimes>limitTimes){
System.out.println("访问频率过高,请稍后再试!");
return false;
}else{
acceptTimes++;
System.out.println("访问成功!");
return true;
}
}

/**
* 限流时间段重置后初始化
*/
private void init(){
currentTimeStart = new Date().getTime();
acceptTimes = 0L;
}

}
posted @ 2021-12-20 16:07  不想取名007  阅读(203)  评论(1)    收藏  举报