카운터 구매 실현

1386 단어
최근에 구매를 하고 있는데 구매를 하면 동시 요구가 높아진다. 대량의 방문 주문은 아침 서버의 압력이 너무 크다. 계수기의 기능을 사용하여 단위 시간 내에 일정 수량의 사람들만 들어오도록 허락하여 하류의 압력이 너무 커지는 것을 방지한다.
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;
        }
    }
}

좋은 웹페이지 즐겨찾기