抢购计数器实现

最近在做抢购,抢购就有了高并发要求,大量的访问下单会早场服务器压力过大,通过使用计数器的功能,单位时间内只允许一定数量的人进来,防止造成下游压力过大。

private static ConcurrentHashMap<String,Counter> counters = new ConcurrentHashMap<String, Counter>();
Counter counter = null;
if(counters.get(relatedId)==null){//relatedId 抢购活动id
	counter = new Counter(100,10*1000); //10内允许 100人进行下单
	counters.put(relatedId,counter);
} else{
	counter = counters.get(relatedId);
}

if(counter.getAndDecrement()<=0)  {
	HashMap<String,String> map = new HashMap<String, String>();
	map.put(RESP_CODE, ERROR);
	map.put(RESP_MSG, "抢购活动太火爆,请稍后再试");
}

Counter:计数器

public class Counter {

    private AtomicInteger counter;
    private long start;
    private int count;
    private int expire;
    public Counter(int count,int expire){
        counter = new AtomicInteger(count);
        start = System.currentTimeMillis();
        this.count = count;
        this.expire =expire;
    }

    public int getAndDecrement(){
        reset();
        int count = counter.getAndDecrement();
        return count;
    }

    private synchronized void reset(){
        long current = System.currentTimeMillis();
        if(Math.abs(current - start)>expire)  { // 超过指定时间后,重新分配
            counter = new AtomicInteger(count);
            start = current;
        }
    }
}


你可能感兴趣的:(抢购计数器实现)