计数器思想,
设置一个请求上限100,当访问量超过100就限。
public class CountDemo { private static long timeStamp = System.currentTimeMillis(); private static long limitCount = 100; private static long interval = 1000; private static long reqCount = 0; public static boolean grant(){ long now = System.currentTimeMillis(); if(now < timeStamp + interval){ if(reqCount < limitCount){ ++ reqCount; return true; }else { return false; } }else { timeStamp = System.currentTimeMillis(); reqCount = 0; return false; } } public static void main(String[] args) { for (int i = 0; i < 101; i++) { new Thread(new Runnable() { @Override public void run() { if(grant()){ System.out.println("正常"); }else { System.out.println("限制"); } } }).start(); } } }
可以有两种计数时间限制方式:
1、一定的时间内计数,比如,按分钟计数,到了下一分钟计数器清零重新来。这种忽略了时间临界问题,可能在时间临界点大于设置的阈值。
2、移动版时间范围计数,比如:按分钟计数,这个一分钟和上面不一样的是,计数器不会清0,而是统计时间长度为一分钟内的请求数量。